{"version":3,"sources":["webpack:///./node_modules/gatsby-link/index.js","webpack:///./node_modules/gatsby-react-router-scroll/session-storage.js","webpack:///./node_modules/@babel/runtime/helpers/interopRequireWildcard.js","webpack:///./node_modules/gatsby-react-router-scroll/use-scroll-restoration.js","webpack:///./node_modules/mitt/dist/mitt.es.js","webpack:///./.cache/emitter.js","webpack:///./.cache/polyfills/object-assign.js","webpack:///./node_modules/gatsby-react-router-scroll/index.js","webpack:///./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js","webpack:///./.cache/react-lifecycles-compat.js","webpack:///./node_modules/@reach/router/es/lib/history.js","webpack:///./node_modules/gatsby-react-router-scroll/scroll-handler.js","webpack:///./.cache/page-renderer.js","webpack:///./node_modules/@reach/router/es/lib/utils.js","webpack:///./.cache/api-runner-browser-plugins.js","webpack:///./node_modules/@mikaelkristiansson/domready/ready.js","webpack:///./.cache/register-service-worker.js","webpack:///./node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack:///./node_modules/invariant/browser.js","webpack:///./node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack:///./.cache/route-announcer-props.js","webpack:///./.cache/navigation.js","webpack:///./node_modules/shallow-compare/es/index.js","webpack:///./.cache/ensure-resources.js","webpack:///./.cache/production-app.js","webpack:///./node_modules/@babel/runtime/helpers/inheritsLoose.js","webpack:///./_this_is_virtual_fs_path_/$virtual/async-requires.js","webpack:///./.cache/gatsby-browser-entry.js","webpack:///./node_modules/@reach/router/es/index.js","webpack:///./node_modules/@babel/runtime/helpers/typeof.js","webpack:///./.cache/strip-prefix.js","webpack:///./node_modules/gatsby-link/parse-path.js","webpack:///./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack:///./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack:///./.cache/prefetch.js","webpack:///./.cache/normalize-page-path.js","webpack:///./.cache/find-path.js","webpack:///./.cache/loader.js","webpack:///./node_modules/gatsby-remark-autolink-headers/gatsby-browser.js","webpack:///./node_modules/gatsby-react-router-scroll/scroll-container.js","webpack:///./.cache/public-page-renderer.js","webpack:///./.cache/create-react-context.js","webpack:///./node_modules/@babel/runtime/helpers/extends.js","webpack:///./.cache/public-page-renderer-prod.js","webpack:///./.cache/api-runner-browser.js"],"names":["_interopRequireDefault","exports","__esModule","withPrefix","withAssetPrefix","path","getGlobalPathPrefix","navigateTo","replace","push","navigate","default","_objectWithoutPropertiesLoose2","_extends2","_assertThisInitialized2","_inheritsLoose2","_propTypes","_react","_router","_utils","_parsePath","parsePath","isAbsolutePath","startsWith","prefix","_ref","_prefix","getGlobalBasePrefix","isLocalLink","base","endsWith","slice","rewriteLinkPath","relativeTo","current","resolve","absolutify","NavLinkPropTypes","activeClassName","string","activeStyle","object","partiallyActive","bool","GatsbyLink","_React$Component","props","_this","call","this","defaultGetProps","_ref2","isPartiallyCurrent","isCurrent","className","filter","Boolean","join","style","IOSupported","window","IntersectionObserver","state","handleRef","bind","_proto","prototype","componentDidUpdate","prevProps","prevState","to","___loader","enqueue","location","pathname","componentDidMount","componentWillUnmount","io","_this$io","instance","el","unobserve","disconnect","ref","cb","_this2","innerRef","hasOwnProperty","entries","forEach","entry","target","isIntersecting","intersectionRatio","observe","render","_this3","_this$props","_this$props$getProps","getProps","_onClick","onClick","_onMouseEnter","onMouseEnter","rest","createElement","Location","_ref3","prefixedTo","Link","e","hovering","button","defaultPrevented","metaKey","altKey","ctrlKey","shiftKey","preventDefault","shouldReplace","encodeURI","___navigate","href","Component","propTypes","func","isRequired","showDeprecationWarning","functionName","altFunctionName","version","console","warn","_default","forwardRef","options","___push","___replace","SessionStorage","read","key","stateKey","getStateKey","value","sessionStorage","getItem","JSON","parse","save","storedValue","stringify","setItem","stateKeyBase","_typeof","_getRequireWildcardCache","WeakMap","cache","module","obj","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","desc","set","useScrollRestoration","identifier","useLocation","useContext","_scrollHandler","ScrollContext","useRef","useLayoutEffect","position","scrollTo","onScroll","scrollTop","emitter","all","create","on","type","handler","off","splice","indexOf","emit","evt","map","mitt","assign","ScrollContainer","ScrollHandler","_scrollContainer","_useScrollRestoration","source","excluded","i","sourceKeys","keys","length","polyfill","_extends","arguments","getLocation","_source$location","search","hash","origin","protocol","host","hostname","port","canUseDOM","URL","decodeURI","history","createHistory","listeners","transitioning","resolveTransition","_onTransitionComplete","listen","listener","popstateListener","action","addEventListener","removeEventListener","fn","undefined","_ref$replace","go","Date","now","replaceState","pushState","transition","Promise","res","createMemorySource","initialPath","searchIndex","initialLocation","substr","index","stack","states","name","_","uri","_uri$split","split","_uri$split$","_uri$split2","_uri$split2$","newIndex","document","globalHistory","_interopRequireWildcard","React","_sessionStorage","createContext","displayName","_len","args","Array","_key","apply","concat","_stateStorage","scrollListener","scrollY","windowScroll","shouldUpdateScroll","scrollToHash","node","getElementById","substring","scrollIntoView","prevRouterProps","routerProps","scrollPosition","_this$props$location","_this$props$location2","Provider","children","element","PageRenderer","pathContext","pageContext","pageElement","apiRunner","loader","publicLoader","pageResources","component","page","result","pop","pick","routes","match","default_","uriPathname","uriSegments","segmentize","isRootUri","ranked","rankRoutes","l","missed","route","params","routeSegments","max","Math","routeSegment","uriSegment","isSplat","decodeURIComponent","dynamicMatch","paramRe","exec","reservedNames","_to$split","toPathname","toQuery","basePathname","toSegments","baseSegments","addQuery","allSegments","segments","segment","insertParams","_path$split","pathBase","_path$split$","query","constructedPath","_params$location","_params$location$sear","searchSplit","validateRedirect","from","isDynamic","sort","test","rankRoute","score","reduce","isRootSegment","SEGMENT_POINTS","a","b","q","shallowCompare","obj1","obj2","obj1Keys","every","plugin","require","ie10","navigator","appVersion","fns","doc","hack","documentElement","doScroll","loaded","readyState","shift","setTimeout","definition","error","serviceWorker","register","__BASE_PATH__","then","reg","installingWorker","installing","log","controller","___swUpdated","___failedResources","reload","catch","self","ReferenceError","condition","format","c","d","f","Error","argIndex","framesToPop","RouteAnnouncerProps","id","top","width","height","padding","overflow","clip","whiteSpace","border","redirectMap","redirects","redirect","fromPath","maybeRedirect","toPath","onPreRouteUpdate","prevLocation","onRouteUpdate","timeoutId","loadPage","status","PageResourceStatus","clearTimeout","webpackCompilationHash","___webpackCompilationHash","postMessage","gatsbyApi","reachNavigate","results","getSavedScrollPosition","RouteAnnouncer","announcementRef","createRef","nextProps","requestAnimationFrame","pageName","title","pageHeadings","querySelectorAll","textContent","newAnnouncement","innerText","RouteUpdates","shouldFireRouteUpdate","getSnapshotBeforeUpdate","Fragment","shallowDiffers","_i","EnsureResources","loadPageSync","getDerivedStateFromProps","loadResources","rawPath","setState","shouldComponentUpdate","nextState","json","matchPath","ProdLoader","asyncRequires","matchPaths","setLoader","setApiRunner","___emitter","apiRunnerAsync","RouteHandler","baseuri","basepath","DataContext","GatsbyRoot","staticQueryResults","LocationHandler","Consumer","stripPrefix","pagePath","browserLoc","findMatchPath","SiteRoot","App","renderer","ReactDOM","hydrate","domReady","subClass","superClass","constructor","__proto__","components","StaticQueryContext","_objectWithoutProperties","_classCallCheck","Constructor","TypeError","_possibleConstructorReturn","_inherits","enumerable","writable","configurable","setPrototypeOf","createNamedContext","defaultValue","Ctx","LocationContext","context","LocationProvider","_temp","getContext","refs","unlisten","_props$history","componentDidCatch","info","isRedirect","_navigate","unmounted","defaultProps","ServerLocation","url","BaseContext","Router","baseContext","locationContext","RouterImpl","_React$PureComponent","_props","_navigate2","primary","_props$component","domProps","Children","toArray","array","child","createRoute","clone","cloneElement","FocusWrapper","FocusHandler","wrapperProps","PureComponent","FocusContext","requestFocus","FocusHandlerImpl","initialRender","focusHandlerCount","_React$Component2","_temp2","_this4","_len2","_key2","shouldFocus","focus","myURIChanged","navigatedUpToMe","contains","activeElement","_this5","_props2","_props2$component","Comp","outline","tabIndex","n","k","C","_ref4","_ref5","_ref6","_props$getProps","anchorProps","encodedHref","event","shouldNavigate","_location$state","restState","RedirectRequest","o","redirectTo","RedirectImpl","_React$Component3","_props3","_props3$replace","noThrow","resolvedTo","_props4","Redirect","_ref7","Match","_ref8","_ref9","_ref10","resolvedPath","useNavigate","useParams","useMatch","stripSlashes","str","elementPath","Symbol","iterator","hashIndex","_inheritsLoose","_arrayLikeToArray","arr","len","arr2","_toConsumableArray","isArray","iter","minLen","toString","supportedPrefetchStrategy","feature","fakeLink","relList","supports","err","support","reject","link","setAttribute","onload","onerror","getElementsByTagName","getElementsByName","parentNode","appendChild","req","XMLHttpRequest","open","send","preFetched","prefetch","charAt","pathCache","Map","trimPathname","rawPathname","trimmedPathname","cleanPath","normalizePagePath","findPath","foundPath","Success","preferDefault","m","createPageDataUrl","s","__PATH_PREFIX__","doFetch","method","onreadystatechange","toPageResources","pageData","componentChunkName","staticQueryHashes","BaseLoader","loadComponent","inFlightNetworkRequests","pageDb","inFlightDb","staticQueryDb","pageDataDb","prefetchTriggered","Set","prefetchCompleted","memoizedGet","inFlightPromise","response","delete","prefetchDisabled","some","fetchPageDataJson","loadObj","retries","responseText","jsonPayload","payload","notFound","loadPageDataJson","loadAppData","allData","finalResult","componentChunkPromise","createdAt","staticQueryBatchPromise","staticQueryHash","staticQueryResultsMap","shouldPrefetch","connection","effectiveType","includes","saveData","doesConnectionSupportPrefetch","add","realPath","doPrefetch","getResourceURLsForPathname","createComponentUrls","isPageNotFound","appData","___chunkMapping","chunk","chunkName","pageDataUrl","prefetchHelper","crossOrigin","as","componentUrls","data","_loader","getResourcesForPathname","getResourcesForPathnameSync","offsetY","getTargetOffset","pageYOffset","body","clientTop","computedStyles","getComputedStyle","scrollMarginTop","getPropertyValue","getBoundingClientRect","parseInt","onInitialClientRender","pluginOptions","offset","_reactDom","scrollKey","ScrollContainerImplementation","findDOMNode","ProdPageRenderer","InternalPageRenderer","plugins","api","defaultReturn","argTransform","previous","next"],"mappings":"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","file":"app-d7398b08e923fe8a3caa.js","sourcesContent":["\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.withPrefix = withPrefix;\nexports.withAssetPrefix = withAssetPrefix;\nexports.navigateTo = exports.replace = exports.push = exports.navigate = exports.default = void 0;\n\nvar _objectWithoutPropertiesLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutPropertiesLoose\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _router = require(\"@reach/router\");\n\nvar _utils = require(\"@reach/router/lib/utils\");\n\nvar _parsePath = require(\"./parse-path\");\n\nexports.parsePath = _parsePath.parsePath;\n\nvar isAbsolutePath = function isAbsolutePath(path) {\n  return path === null || path === void 0 ? void 0 : path.startsWith(\"/\");\n};\n\nfunction withPrefix(path, prefix) {\n  var _ref, _prefix;\n\n  if (prefix === void 0) {\n    prefix = getGlobalBasePrefix();\n  }\n\n  if (!isLocalLink(path)) {\n    return path;\n  }\n\n  if (path.startsWith(\"./\") || path.startsWith(\"../\")) {\n    return path;\n  }\n\n  var base = (_ref = (_prefix = prefix) !== null && _prefix !== void 0 ? _prefix : getGlobalPathPrefix()) !== null && _ref !== void 0 ? _ref : \"/\";\n  return \"\" + ((base === null || base === void 0 ? void 0 : base.endsWith(\"/\")) ? base.slice(0, -1) : base) + (path.startsWith(\"/\") ? path : \"/\" + path);\n} // These global values are wrapped in typeof clauses to ensure the values exist.\n// This is especially problematic in unit testing of this component.\n\n\nvar getGlobalPathPrefix = function getGlobalPathPrefix() {\n  return process.env.NODE_ENV !== \"production\" ? typeof __PATH_PREFIX__ !== \"undefined\" ? __PATH_PREFIX__ : undefined : __PATH_PREFIX__;\n};\n\nvar getGlobalBasePrefix = function getGlobalBasePrefix() {\n  return process.env.NODE_ENV !== \"production\" ? typeof __BASE_PATH__ !== \"undefined\" ? __BASE_PATH__ : undefined : __BASE_PATH__;\n};\n\nvar isLocalLink = function isLocalLink(path) {\n  return path && !path.startsWith(\"http://\") && !path.startsWith(\"https://\") && !path.startsWith(\"//\");\n};\n\nfunction withAssetPrefix(path) {\n  return withPrefix(path, getGlobalPathPrefix());\n}\n\nfunction absolutify(path, current) {\n  // If it's already absolute, return as-is\n  if (isAbsolutePath(path)) {\n    return path;\n  }\n\n  return (0, _utils.resolve)(path, current);\n}\n\nvar rewriteLinkPath = function rewriteLinkPath(path, relativeTo) {\n  if (typeof path === \"number\") {\n    return path;\n  }\n\n  if (!isLocalLink(path)) {\n    return path;\n  }\n\n  return isAbsolutePath(path) ? withPrefix(path) : absolutify(path, relativeTo);\n};\n\nvar NavLinkPropTypes = {\n  activeClassName: _propTypes.default.string,\n  activeStyle: _propTypes.default.object,\n  partiallyActive: _propTypes.default.bool\n}; // Set up IntersectionObserver\n\nvar createIntersectionObserver = function createIntersectionObserver(el, cb) {\n  var io = new window.IntersectionObserver(function (entries) {\n    entries.forEach(function (entry) {\n      if (el === entry.target) {\n        // Check if element is within viewport, remove listener, destroy observer, and run link callback.\n        // MSEdge doesn't currently support isIntersecting, so also test for  an intersectionRatio > 0\n        if (entry.isIntersecting || entry.intersectionRatio > 0) {\n          io.unobserve(el);\n          io.disconnect();\n          cb();\n        }\n      }\n    });\n  }); // Add element to the observer\n\n  io.observe(el);\n  return {\n    instance: io,\n    el: el\n  };\n};\n\nvar GatsbyLink = /*#__PURE__*/function (_React$Component) {\n  (0, _inheritsLoose2.default)(GatsbyLink, _React$Component);\n\n  function GatsbyLink(props) {\n    var _this;\n\n    _this = _React$Component.call(this, props) || this; // Default to no support for IntersectionObserver\n\n    _this.defaultGetProps = function (_ref2) {\n      var isPartiallyCurrent = _ref2.isPartiallyCurrent,\n          isCurrent = _ref2.isCurrent;\n\n      if (_this.props.partiallyActive ? isPartiallyCurrent : isCurrent) {\n        return {\n          className: [_this.props.className, _this.props.activeClassName].filter(Boolean).join(\" \"),\n          style: (0, _extends2.default)({}, _this.props.style, _this.props.activeStyle)\n        };\n      }\n\n      return null;\n    };\n\n    var IOSupported = false;\n\n    if (typeof window !== \"undefined\" && window.IntersectionObserver) {\n      IOSupported = true;\n    }\n\n    _this.state = {\n      IOSupported: IOSupported\n    };\n    _this.handleRef = _this.handleRef.bind((0, _assertThisInitialized2.default)(_this));\n    return _this;\n  }\n\n  var _proto = GatsbyLink.prototype;\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    // Preserve non IO functionality if no support\n    if (this.props.to !== prevProps.to && !this.state.IOSupported) {\n      ___loader.enqueue((0, _parsePath.parsePath)(rewriteLinkPath(this.props.to, window.location.pathname)).pathname);\n    }\n  };\n\n  _proto.componentDidMount = function componentDidMount() {\n    // Preserve non IO functionality if no support\n    if (!this.state.IOSupported) {\n      ___loader.enqueue((0, _parsePath.parsePath)(rewriteLinkPath(this.props.to, window.location.pathname)).pathname);\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (!this.io) {\n      return;\n    }\n\n    var _this$io = this.io,\n        instance = _this$io.instance,\n        el = _this$io.el;\n    instance.unobserve(el);\n    instance.disconnect();\n  };\n\n  _proto.handleRef = function handleRef(ref) {\n    var _this2 = this;\n\n    if (this.props.innerRef && this.props.innerRef.hasOwnProperty(\"current\")) {\n      this.props.innerRef.current = ref;\n    } else if (this.props.innerRef) {\n      this.props.innerRef(ref);\n    }\n\n    if (this.state.IOSupported && ref) {\n      // If IO supported and element reference found, setup Observer functionality\n      this.io = createIntersectionObserver(ref, function () {\n        ___loader.enqueue((0, _parsePath.parsePath)(rewriteLinkPath(_this2.props.to, window.location.pathname)).pathname);\n      });\n    }\n  };\n\n  _proto.render = function render() {\n    var _this3 = this;\n\n    var _this$props = this.props,\n        to = _this$props.to,\n        _this$props$getProps = _this$props.getProps,\n        getProps = _this$props$getProps === void 0 ? this.defaultGetProps : _this$props$getProps,\n        _onClick = _this$props.onClick,\n        _onMouseEnter = _this$props.onMouseEnter,\n        $activeClassName = _this$props.activeClassName,\n        $activeStyle = _this$props.activeStyle,\n        $innerRef = _this$props.innerRef,\n        partiallyActive = _this$props.partiallyActive,\n        state = _this$props.state,\n        replace = _this$props.replace,\n        rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props, [\"to\", \"getProps\", \"onClick\", \"onMouseEnter\", \"activeClassName\", \"activeStyle\", \"innerRef\", \"partiallyActive\", \"state\", \"replace\"]);\n\n    if (process.env.NODE_ENV !== \"production\" && !isLocalLink(to)) {\n      console.warn(\"External link \" + to + \" was detected in a Link component. Use the Link component only for internal links. See: https://gatsby.dev/internal-links\");\n    }\n\n    return /*#__PURE__*/_react.default.createElement(_router.Location, null, function (_ref3) {\n      var location = _ref3.location;\n      var prefixedTo = rewriteLinkPath(to, location.pathname);\n      return isLocalLink(prefixedTo) ? /*#__PURE__*/_react.default.createElement(_router.Link, (0, _extends2.default)({\n        to: prefixedTo,\n        state: state,\n        getProps: getProps,\n        innerRef: _this3.handleRef,\n        onMouseEnter: function onMouseEnter(e) {\n          if (_onMouseEnter) {\n            _onMouseEnter(e);\n          }\n\n          ___loader.hovering((0, _parsePath.parsePath)(prefixedTo).pathname);\n        },\n        onClick: function onClick(e) {\n          if (_onClick) {\n            _onClick(e);\n          }\n\n          if (e.button === 0 && // ignore right clicks\n          !_this3.props.target && // let browser handle \"target=_blank\"\n          !e.defaultPrevented && // onClick prevented default\n          !e.metaKey && // ignore clicks with modifier keys...\n          !e.altKey && !e.ctrlKey && !e.shiftKey) {\n            e.preventDefault();\n            var shouldReplace = replace;\n            var isCurrent = encodeURI(prefixedTo) === window.location.pathname;\n\n            if (typeof replace !== \"boolean\" && isCurrent) {\n              shouldReplace = true;\n            } // Make sure the necessary scripts and data are\n            // loaded before continuing.\n\n\n            window.___navigate(prefixedTo, {\n              state: state,\n              replace: shouldReplace\n            });\n          }\n\n          return true;\n        }\n      }, rest)) : /*#__PURE__*/_react.default.createElement(\"a\", (0, _extends2.default)({\n        href: prefixedTo\n      }, rest));\n    });\n  };\n\n  return GatsbyLink;\n}(_react.default.Component);\n\nGatsbyLink.propTypes = (0, _extends2.default)({}, NavLinkPropTypes, {\n  onClick: _propTypes.default.func,\n  to: _propTypes.default.string.isRequired,\n  replace: _propTypes.default.bool,\n  state: _propTypes.default.object\n});\n\nvar showDeprecationWarning = function showDeprecationWarning(functionName, altFunctionName, version) {\n  return console.warn(\"The \\\"\" + functionName + \"\\\" method is now deprecated and will be removed in Gatsby v\" + version + \". Please use \\\"\" + altFunctionName + \"\\\" instead.\");\n};\n\nvar _default = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {\n  return /*#__PURE__*/_react.default.createElement(GatsbyLink, (0, _extends2.default)({\n    innerRef: ref\n  }, props));\n});\n\nexports.default = _default;\n\nvar navigate = function navigate(to, options) {\n  window.___navigate(rewriteLinkPath(to, window.location.pathname), options);\n};\n\nexports.navigate = navigate;\n\nvar push = function push(to) {\n  showDeprecationWarning(\"push\", \"navigate\", 3);\n\n  window.___push(rewriteLinkPath(to, window.location.pathname));\n};\n\nexports.push = push;\n\nvar replace = function replace(to) {\n  showDeprecationWarning(\"replace\", \"navigate\", 3);\n\n  window.___replace(rewriteLinkPath(to, window.location.pathname));\n}; // TODO: Remove navigateTo for Gatsby v3\n\n\nexports.replace = replace;\n\nvar navigateTo = function navigateTo(to) {\n  showDeprecationWarning(\"navigateTo\", \"navigate\", 3);\n  return push(to);\n};\n\nexports.navigateTo = navigateTo;","\"use strict\";\n\nexports.__esModule = true;\nexports.SessionStorage = void 0;\nvar STATE_KEY_PREFIX = \"@@scroll|\";\nvar GATSBY_ROUTER_SCROLL_STATE = \"___GATSBY_REACT_ROUTER_SCROLL\";\n\nvar SessionStorage = /*#__PURE__*/function () {\n  function SessionStorage() {}\n\n  var _proto = SessionStorage.prototype;\n\n  _proto.read = function read(location, key) {\n    var stateKey = this.getStateKey(location, key);\n\n    try {\n      var value = window.sessionStorage.getItem(stateKey);\n      return value ? JSON.parse(value) : 0;\n    } catch (e) {\n      if (process.env.NODE_ENV !== \"production\") {\n        console.warn(\"[gatsby-react-router-scroll] Unable to access sessionStorage; sessionStorage is not available.\");\n      }\n\n      if (window && window[GATSBY_ROUTER_SCROLL_STATE] && window[GATSBY_ROUTER_SCROLL_STATE][stateKey]) {\n        return window[GATSBY_ROUTER_SCROLL_STATE][stateKey];\n      }\n\n      return 0;\n    }\n  };\n\n  _proto.save = function save(location, key, value) {\n    var stateKey = this.getStateKey(location, key);\n    var storedValue = JSON.stringify(value);\n\n    try {\n      window.sessionStorage.setItem(stateKey, storedValue);\n    } catch (e) {\n      if (window && window[GATSBY_ROUTER_SCROLL_STATE]) {\n        window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n      } else {\n        window[GATSBY_ROUTER_SCROLL_STATE] = {};\n        window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n      }\n\n      if (process.env.NODE_ENV !== \"production\") {\n        console.warn(\"[gatsby-react-router-scroll] Unable to save state in sessionStorage; sessionStorage is not available.\");\n      }\n    }\n  };\n\n  _proto.getStateKey = function getStateKey(location, key) {\n    var stateKeyBase = \"\" + STATE_KEY_PREFIX + location.pathname;\n    return key === null || typeof key === \"undefined\" ? stateKeyBase : stateKeyBase + \"|\" + key;\n  };\n\n  return SessionStorage;\n}();\n\nexports.SessionStorage = SessionStorage;","var _typeof = require(\"../helpers/typeof\");\n\nfunction _getRequireWildcardCache() {\n  if (typeof WeakMap !== \"function\") return null;\n  var cache = new WeakMap();\n\n  _getRequireWildcardCache = function _getRequireWildcardCache() {\n    return cache;\n  };\n\n  return cache;\n}\n\nfunction _interopRequireWildcard(obj) {\n  if (obj && obj.__esModule) {\n    return obj;\n  }\n\n  if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") {\n    return {\n      \"default\": obj\n    };\n  }\n\n  var cache = _getRequireWildcardCache();\n\n  if (cache && cache.has(obj)) {\n    return cache.get(obj);\n  }\n\n  var newObj = {};\n  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n  for (var key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n\n      if (desc && (desc.get || desc.set)) {\n        Object.defineProperty(newObj, key, desc);\n      } else {\n        newObj[key] = obj[key];\n      }\n    }\n  }\n\n  newObj[\"default\"] = obj;\n\n  if (cache) {\n    cache.set(obj, newObj);\n  }\n\n  return newObj;\n}\n\nmodule.exports = _interopRequireWildcard;","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = useScrollRestoration;\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nvar _react = require(\"react\");\n\nvar _router = require(\"@reach/router\");\n\nfunction useScrollRestoration(identifier) {\n  var location = (0, _router.useLocation)();\n  var state = (0, _react.useContext)(_scrollHandler.ScrollContext);\n  var ref = (0, _react.useRef)();\n  (0, _react.useLayoutEffect)(function () {\n    if (ref.current) {\n      var position = state.read(location, identifier);\n      ref.current.scrollTo(0, position || 0);\n    }\n  }, []);\n  return {\n    ref: ref,\n    onScroll: function onScroll() {\n      if (ref.current) {\n        state.save(location, identifier, ref.current.scrollTop);\n      }\n    }\n  };\n}","//      \n// An event handler can take an optional event argument\n// and should not return a value\n                                          \n                                                               \n\n// An array of all currently registered event handlers for a type\n                                            \n                                                            \n// A map of event types and their corresponding event handlers.\n                        \n                                 \n                                   \n  \n\n/** Mitt: Tiny (~200b) functional event emitter / pubsub.\n *  @name mitt\n *  @returns {Mitt}\n */\nfunction mitt(all                 ) {\n\tall = all || Object.create(null);\n\n\treturn {\n\t\t/**\n\t\t * Register an event handler for the given type.\n\t\t *\n\t\t * @param  {String} type\tType of event to listen for, or `\"*\"` for all events\n\t\t * @param  {Function} handler Function to call in response to given event\n\t\t * @memberOf mitt\n\t\t */\n\t\ton: function on(type        , handler              ) {\n\t\t\t(all[type] || (all[type] = [])).push(handler);\n\t\t},\n\n\t\t/**\n\t\t * Remove an event handler for the given type.\n\t\t *\n\t\t * @param  {String} type\tType of event to unregister `handler` from, or `\"*\"`\n\t\t * @param  {Function} handler Handler function to remove\n\t\t * @memberOf mitt\n\t\t */\n\t\toff: function off(type        , handler              ) {\n\t\t\tif (all[type]) {\n\t\t\t\tall[type].splice(all[type].indexOf(handler) >>> 0, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Invoke all handlers for the given type.\n\t\t * If present, `\"*\"` handlers are invoked after type-matched handlers.\n\t\t *\n\t\t * @param {String} type  The event type to invoke\n\t\t * @param {Any} [evt]  Any value (object is recommended and powerful), passed to each handler\n\t\t * @memberOf mitt\n\t\t */\n\t\temit: function emit(type        , evt     ) {\n\t\t\t(all[type] || []).slice().map(function (handler) { handler(evt); });\n\t\t\t(all['*'] || []).slice().map(function (handler) { handler(type, evt); });\n\t\t}\n\t};\n}\n\nexport default mitt;\n//# sourceMappingURL=mitt.es.js.map\n","import mitt from \"mitt\"\n\nconst emitter = mitt()\nexport default emitter\n","module.exports = Object.assign\n","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = exports.ScrollContainer = exports.ScrollContext = void 0;\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nexports.ScrollContext = _scrollHandler.ScrollHandler;\n\nvar _scrollContainer = require(\"./scroll-container\");\n\nexports.ScrollContainer = _scrollContainer.ScrollContainer;\n\nvar _useScrollRestoration = require(\"./use-scroll-restoration\");\n\nexports.useScrollRestoration = _useScrollRestoration.useScrollRestoration;","function _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}\n\nmodule.exports = _objectWithoutPropertiesLoose;","exports.polyfill = Component => Component\n","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar getLocation = function getLocation(source) {\n  var _source$location = source.location,\n      search = _source$location.search,\n      hash = _source$location.hash,\n      href = _source$location.href,\n      origin = _source$location.origin,\n      protocol = _source$location.protocol,\n      host = _source$location.host,\n      hostname = _source$location.hostname,\n      port = _source$location.port;\n  var pathname = source.location.pathname;\n\n\n  if (!pathname && href && canUseDOM) {\n    var url = new URL(href);\n    pathname = url.pathname;\n  }\n\n  return {\n    pathname: encodeURI(decodeURI(pathname)),\n    search: search,\n    hash: hash,\n    href: href,\n    origin: origin,\n    protocol: protocol,\n    host: host,\n    hostname: hostname,\n    port: port,\n    state: source.history.state,\n    key: source.history.state && source.history.state.key || \"initial\"\n  };\n};\n\nvar createHistory = function createHistory(source, options) {\n  var listeners = [];\n  var location = getLocation(source);\n  var transitioning = false;\n  var resolveTransition = function resolveTransition() {};\n\n  return {\n    get location() {\n      return location;\n    },\n\n    get transitioning() {\n      return transitioning;\n    },\n\n    _onTransitionComplete: function _onTransitionComplete() {\n      transitioning = false;\n      resolveTransition();\n    },\n    listen: function listen(listener) {\n      listeners.push(listener);\n\n      var popstateListener = function popstateListener() {\n        location = getLocation(source);\n        listener({ location: location, action: \"POP\" });\n      };\n\n      source.addEventListener(\"popstate\", popstateListener);\n\n      return function () {\n        source.removeEventListener(\"popstate\", popstateListener);\n        listeners = listeners.filter(function (fn) {\n          return fn !== listener;\n        });\n      };\n    },\n    navigate: function navigate(to) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          state = _ref.state,\n          _ref$replace = _ref.replace,\n          replace = _ref$replace === undefined ? false : _ref$replace;\n\n      if (typeof to === \"number\") {\n        source.history.go(to);\n      } else {\n        state = _extends({}, state, { key: Date.now() + \"\" });\n        // try...catch iOS Safari limits to 100 pushState calls\n        try {\n          if (transitioning || replace) {\n            source.history.replaceState(state, null, to);\n          } else {\n            source.history.pushState(state, null, to);\n          }\n        } catch (e) {\n          source.location[replace ? \"replace\" : \"assign\"](to);\n        }\n      }\n\n      location = getLocation(source);\n      transitioning = true;\n      var transition = new Promise(function (res) {\n        return resolveTransition = res;\n      });\n      listeners.forEach(function (listener) {\n        return listener({ location: location, action: \"PUSH\" });\n      });\n      return transition;\n    }\n  };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\nvar createMemorySource = function createMemorySource() {\n  var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"/\";\n\n  var searchIndex = initialPath.indexOf(\"?\");\n  var initialLocation = {\n    pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n    search: searchIndex > -1 ? initialPath.substr(searchIndex) : \"\"\n  };\n  var index = 0;\n  var stack = [initialLocation];\n  var states = [null];\n\n  return {\n    get location() {\n      return stack[index];\n    },\n    addEventListener: function addEventListener(name, fn) {},\n    removeEventListener: function removeEventListener(name, fn) {},\n\n    history: {\n      get entries() {\n        return stack;\n      },\n      get index() {\n        return index;\n      },\n      get state() {\n        return states[index];\n      },\n      pushState: function pushState(state, _, uri) {\n        var _uri$split = uri.split(\"?\"),\n            pathname = _uri$split[0],\n            _uri$split$ = _uri$split[1],\n            search = _uri$split$ === undefined ? \"\" : _uri$split$;\n\n        index++;\n        stack.push({ pathname: pathname, search: search.length ? \"?\" + search : search });\n        states.push(state);\n      },\n      replaceState: function replaceState(state, _, uri) {\n        var _uri$split2 = uri.split(\"?\"),\n            pathname = _uri$split2[0],\n            _uri$split2$ = _uri$split2[1],\n            search = _uri$split2$ === undefined ? \"\" : _uri$split2$;\n\n        stack[index] = { pathname: pathname, search: search };\n        states[index] = state;\n      },\n      go: function go(to) {\n        var newIndex = index + to;\n\n        if (newIndex < 0 || newIndex > states.length - 1) {\n          return;\n        }\n\n        index = newIndex;\n      }\n    }\n  };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\nvar getSource = function getSource() {\n  return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar navigate = globalHistory.navigate;\n\n////////////////////////////////////////////////////////////////////////////////\n\nexport { globalHistory, navigate, createHistory, createMemorySource };","\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.ScrollHandler = exports.ScrollContext = void 0;\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _sessionStorage = require(\"./session-storage\");\n\nvar ScrollContext = React.createContext(new _sessionStorage.SessionStorage());\nexports.ScrollContext = ScrollContext;\nScrollContext.displayName = \"GatsbyScrollContext\";\n\nvar ScrollHandler = /*#__PURE__*/function (_React$Component) {\n  (0, _inheritsLoose2.default)(ScrollHandler, _React$Component);\n\n  function ScrollHandler() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this._stateStorage = new _sessionStorage.SessionStorage();\n\n    _this.scrollListener = function () {\n      var key = _this.props.location.key;\n\n      if (key) {\n        _this._stateStorage.save(_this.props.location, key, window.scrollY);\n      }\n    };\n\n    _this.windowScroll = function (position, prevProps) {\n      if (_this.shouldUpdateScroll(prevProps, _this.props)) {\n        window.scrollTo(0, position);\n      }\n    };\n\n    _this.scrollToHash = function (hash, prevProps) {\n      var node = document.getElementById(hash.substring(1));\n\n      if (node && _this.shouldUpdateScroll(prevProps, _this.props)) {\n        node.scrollIntoView();\n      }\n    };\n\n    _this.shouldUpdateScroll = function (prevRouterProps, routerProps) {\n      var shouldUpdateScroll = _this.props.shouldUpdateScroll;\n\n      if (!shouldUpdateScroll) {\n        return true;\n      } // Hack to allow accessing this._stateStorage.\n\n\n      return shouldUpdateScroll.call((0, _assertThisInitialized2.default)(_this), prevRouterProps, routerProps);\n    };\n\n    return _this;\n  }\n\n  var _proto = ScrollHandler.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    window.addEventListener(\"scroll\", this.scrollListener);\n    var scrollPosition;\n    var _this$props$location = this.props.location,\n        key = _this$props$location.key,\n        hash = _this$props$location.hash;\n\n    if (key) {\n      scrollPosition = this._stateStorage.read(this.props.location, key);\n    }\n\n    if (scrollPosition) {\n      this.windowScroll(scrollPosition, undefined);\n    } else if (hash) {\n      this.scrollToHash(decodeURI(hash), undefined);\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    window.removeEventListener(\"scroll\", this.scrollListener);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var _this$props$location2 = this.props.location,\n        hash = _this$props$location2.hash,\n        key = _this$props$location2.key;\n    var scrollPosition;\n\n    if (key) {\n      scrollPosition = this._stateStorage.read(this.props.location, key);\n    }\n\n    if (hash && scrollPosition === 0) {\n      this.scrollToHash(decodeURI(hash), prevProps);\n    } else {\n      this.windowScroll(scrollPosition, prevProps);\n    }\n  };\n\n  _proto.render = function render() {\n    return /*#__PURE__*/React.createElement(ScrollContext.Provider, {\n      value: this._stateStorage\n    }, this.props.children);\n  };\n\n  return ScrollHandler;\n}(React.Component);\n\nexports.ScrollHandler = ScrollHandler;\nScrollHandler.propTypes = {\n  shouldUpdateScroll: _propTypes.default.func,\n  children: _propTypes.default.element.isRequired,\n  location: _propTypes.default.object.isRequired\n};","import React, { createElement } from \"react\"\nimport PropTypes from \"prop-types\"\nimport { publicLoader } from \"./loader\"\nimport { apiRunner } from \"./api-runner-browser\"\n\n// Renders page\nclass PageRenderer extends React.Component {\n  render() {\n    const props = {\n      ...this.props,\n      pathContext: this.props.pageContext,\n    }\n\n    const [replacementElement] = apiRunner(`replaceComponentRenderer`, {\n      props: this.props,\n      loader: publicLoader,\n    })\n\n    const pageElement =\n      replacementElement ||\n      createElement(this.props.pageResources.component, {\n        ...props,\n        key: this.props.path || this.props.pageResources.page.path,\n      })\n\n    const wrappedPage = apiRunner(\n      `wrapPageElement`,\n      { element: pageElement, props },\n      pageElement,\n      ({ result }) => {\n        return { element: result, props }\n      }\n    ).pop()\n\n    return wrappedPage\n  }\n}\n\nPageRenderer.propTypes = {\n  location: PropTypes.object.isRequired,\n  pageResources: PropTypes.object.isRequired,\n  data: PropTypes.object,\n  pageContext: PropTypes.object.isRequired,\n}\n\nexport default PageRenderer\n","import invariant from \"invariant\";\n\n////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\nvar startsWith = function startsWith(string, search) {\n  return string.substr(0, search.length) === search;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n//     static > dynamic > splat > root\n//\n// This way we don't have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n//     { path, default, value }\n//\n// And a returned match looks like:\n//\n//     { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\nvar pick = function pick(routes, uri) {\n  var match = void 0;\n  var default_ = void 0;\n\n  var _uri$split = uri.split(\"?\"),\n      uriPathname = _uri$split[0];\n\n  var uriSegments = segmentize(uriPathname);\n  var isRootUri = uriSegments[0] === \"\";\n  var ranked = rankRoutes(routes);\n\n  for (var i = 0, l = ranked.length; i < l; i++) {\n    var missed = false;\n    var route = ranked[i].route;\n\n    if (route.default) {\n      default_ = {\n        route: route,\n        params: {},\n        uri: uri\n      };\n      continue;\n    }\n\n    var routeSegments = segmentize(route.path);\n    var params = {};\n    var max = Math.max(uriSegments.length, routeSegments.length);\n    var index = 0;\n\n    for (; index < max; index++) {\n      var routeSegment = routeSegments[index];\n      var uriSegment = uriSegments[index];\n\n      if (isSplat(routeSegment)) {\n        // Hit a splat, just grab the rest, and return a match\n        // uri:   /files/documents/work\n        // route: /files/*\n        var param = routeSegment.slice(1) || \"*\";\n        params[param] = uriSegments.slice(index).map(decodeURIComponent).join(\"/\");\n        break;\n      }\n\n      if (uriSegment === undefined) {\n        // URI is shorter than the route, no match\n        // uri:   /users\n        // route: /users/:userId\n        missed = true;\n        break;\n      }\n\n      var dynamicMatch = paramRe.exec(routeSegment);\n\n      if (dynamicMatch && !isRootUri) {\n        var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n        !matchIsNotReserved ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"<Router> dynamic segment \\\"\" + dynamicMatch[1] + \"\\\" is a reserved name. Please use a different name in path \\\"\" + route.path + \"\\\".\") : invariant(false) : void 0;\n        var value = decodeURIComponent(uriSegment);\n        params[dynamicMatch[1]] = value;\n      } else if (routeSegment !== uriSegment) {\n        // Current segments don't match, not dynamic, not splat, so no match\n        // uri:   /users/123/settings\n        // route: /users/:id/profile\n        missed = true;\n        break;\n      }\n    }\n\n    if (!missed) {\n      match = {\n        route: route,\n        params: params,\n        uri: \"/\" + uriSegments.slice(0, index).join(\"/\")\n      };\n      break;\n    }\n  }\n\n  return match || default_ || null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\nvar match = function match(path, uri) {\n  return pick([{ path: path }], uri);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files.  Relative URIs\n// in the browser can feel awkward because not only can you be \"in a directory\"\n// you can be \"at a file\", too. For example\n//\n//     browserSpecResolve('foo', '/bar/') => /bar/foo\n//     browserSpecResolve('foo', '/bar') => /foo\n//\n// But on the command line of a file system, it's not as complicated, you can't\n// `cd` from a file, only directories.  This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n//     <Link to=\"deeper\"/>\n//     // instead of\n//     <Link to=`{${props.uri}/deeper}`/>\n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n//     cd deeper\n//     # not\n//     cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\nvar resolve = function resolve(to, base) {\n  // /foo/bar, /baz/qux => /foo/bar\n  if (startsWith(to, \"/\")) {\n    return to;\n  }\n\n  var _to$split = to.split(\"?\"),\n      toPathname = _to$split[0],\n      toQuery = _to$split[1];\n\n  var _base$split = base.split(\"?\"),\n      basePathname = _base$split[0];\n\n  var toSegments = segmentize(toPathname);\n  var baseSegments = segmentize(basePathname);\n\n  // ?a=b, /users?b=c => /users?a=b\n  if (toSegments[0] === \"\") {\n    return addQuery(basePathname, toQuery);\n  }\n\n  // profile, /users/789 => /users/789/profile\n  if (!startsWith(toSegments[0], \".\")) {\n    var pathname = baseSegments.concat(toSegments).join(\"/\");\n    return addQuery((basePathname === \"/\" ? \"\" : \"/\") + pathname, toQuery);\n  }\n\n  // ./         /users/123  =>  /users/123\n  // ../        /users/123  =>  /users\n  // ../..      /users/123  =>  /\n  // ../../one  /a/b/c/d    =>  /a/b/one\n  // .././one   /a/b/c/d    =>  /a/b/c/one\n  var allSegments = baseSegments.concat(toSegments);\n  var segments = [];\n  for (var i = 0, l = allSegments.length; i < l; i++) {\n    var segment = allSegments[i];\n    if (segment === \"..\") segments.pop();else if (segment !== \".\") segments.push(segment);\n  }\n\n  return addQuery(\"/\" + segments.join(\"/\"), toQuery);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\nvar insertParams = function insertParams(path, params) {\n  var _path$split = path.split(\"?\"),\n      pathBase = _path$split[0],\n      _path$split$ = _path$split[1],\n      query = _path$split$ === undefined ? \"\" : _path$split$;\n\n  var segments = segmentize(pathBase);\n  var constructedPath = \"/\" + segments.map(function (segment) {\n    var match = paramRe.exec(segment);\n    return match ? params[match[1]] : segment;\n  }).join(\"/\");\n  var _params$location = params.location;\n  _params$location = _params$location === undefined ? {} : _params$location;\n  var _params$location$sear = _params$location.search,\n      search = _params$location$sear === undefined ? \"\" : _params$location$sear;\n\n  var searchSplit = search.split(\"?\")[1] || \"\";\n  constructedPath = addQuery(constructedPath, query, searchSplit);\n  return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n  var filter = function filter(segment) {\n    return isDynamic(segment);\n  };\n  var fromString = segmentize(from).filter(filter).sort().join(\"/\");\n  var toString = segmentize(to).filter(filter).sort().join(\"/\");\n  return fromString === toString;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar paramRe = /^:(.+)/;\n\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n  return segment === \"\";\n};\nvar isDynamic = function isDynamic(segment) {\n  return paramRe.test(segment);\n};\nvar isSplat = function isSplat(segment) {\n  return segment && segment[0] === \"*\";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n  var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n    score += SEGMENT_POINTS;\n    if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n    return score;\n  }, 0);\n  return { route: route, score: score, index: index };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n  return routes.map(rankRoute).sort(function (a, b) {\n    return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n  });\n};\n\nvar segmentize = function segmentize(uri) {\n  return uri\n  // strip starting/ending slashes\n  .replace(/(^\\/+|\\/+$)/g, \"\").split(\"/\");\n};\n\nvar addQuery = function addQuery(pathname) {\n  for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    query[_key - 1] = arguments[_key];\n  }\n\n  query = query.filter(function (q) {\n    return q && q.length > 0;\n  });\n  return pathname + (query && query.length > 0 ? \"?\" + query.join(\"&\") : \"\");\n};\n\nvar reservedNames = [\"uri\", \"path\"];\n\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n  var obj1Keys = Object.keys(obj1);\n  return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n    return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n  });\n};\n\n////////////////////////////////////////////////////////////////////////////////\nexport { startsWith, pick, match, resolve, insertParams, validateRedirect, shallowCompare };","module.exports = [{\n      plugin: require('../node_modules/gatsby-remark-autolink-headers/gatsby-browser.js'),\n      options: {\"plugins\":[]},\n    }]\n","/*!\n * domready (c) Dustin Diaz 2014 - License MIT\n * ie10 fix - Mikael Kristiansson 2019\n */\n!(function(name, definition) {\n  if (typeof module != \"undefined\") module.exports = definition();\n  else if (typeof define == \"function\" && typeof define.amd == \"object\")\n    define(definition);\n  else this[name] = definition();\n})(\"domready\", function() {\n  var ie10 = false;\n  if (navigator.appVersion.indexOf(\"MSIE 10\") !== -1) {\n    ie10 = true;\n  }\n\n  var fns = [],\n    listener,\n    doc = typeof document === \"object\" && document,\n    hack = ie10\n      ? doc.documentElement.doScroll(\"left\")\n      : doc.documentElement.doScroll,\n    domContentLoaded = \"DOMContentLoaded\",\n    loaded =\n      doc && (hack ? /^loaded|^c/ : /^loaded|^i|^c/).test(doc.readyState);\n\n  if (!loaded && doc)\n    doc.addEventListener(\n      domContentLoaded,\n      (listener = function() {\n        doc.removeEventListener(domContentLoaded, listener);\n        loaded = 1;\n        while ((listener = fns.shift())) listener();\n      })\n    );\n\n  return function(fn) {\n    loaded ? setTimeout(fn, 0) : fns.push(fn);\n  };\n});\n","import { apiRunner } from \"./api-runner-browser\"\n\nif (\n  window.location.protocol !== `https:` &&\n  window.location.hostname !== `localhost`\n) {\n  console.error(\n    `Service workers can only be used over HTTPS, or on localhost for development`\n  )\n} else if (`serviceWorker` in navigator) {\n  navigator.serviceWorker\n    .register(`${__BASE_PATH__}/sw.js`)\n    .then(function (reg) {\n      reg.addEventListener(`updatefound`, () => {\n        apiRunner(`onServiceWorkerUpdateFound`, { serviceWorker: reg })\n        // The updatefound event implies that reg.installing is set; see\n        // https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event\n        const installingWorker = reg.installing\n        console.log(`installingWorker`, installingWorker)\n        installingWorker.addEventListener(`statechange`, () => {\n          switch (installingWorker.state) {\n            case `installed`:\n              if (navigator.serviceWorker.controller) {\n                // At this point, the old content will have been purged and the fresh content will\n                // have been added to the cache.\n\n                // We set a flag so Gatsby Link knows to refresh the page on next navigation attempt\n                window.___swUpdated = true\n                // We call the onServiceWorkerUpdateReady API so users can show update prompts.\n                apiRunner(`onServiceWorkerUpdateReady`, { serviceWorker: reg })\n\n                // If resources failed for the current page, reload.\n                if (window.___failedResources) {\n                  console.log(`resources failed, SW updated - reloading`)\n                  window.location.reload()\n                }\n              } else {\n                // At this point, everything has been precached.\n                // It's the perfect time to display a \"Content is cached for offline use.\" message.\n                console.log(`Content is now available offline!`)\n\n                // Post to service worker that install is complete.\n                // Delay to allow time for the event listener to be added --\n                // otherwise fetch is called too soon and resources aren't cached.\n                apiRunner(`onServiceWorkerInstalled`, { serviceWorker: reg })\n              }\n              break\n\n            case `redundant`:\n              console.error(`The installing service worker became redundant.`)\n              apiRunner(`onServiceWorkerRedundant`, { serviceWorker: reg })\n              break\n\n            case `activated`:\n              apiRunner(`onServiceWorkerActive`, { serviceWorker: reg })\n              break\n          }\n        })\n      })\n    })\n    .catch(function (e) {\n      console.error(`Error during service worker registration:`, e)\n    })\n}\n","function _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nmodule.exports = _assertThisInitialized;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n  if (process.env.NODE_ENV !== 'production') {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  }\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error(\n        'Minified exception occurred; use the non-minified dev environment ' +\n        'for the full error message and additional helpful warnings.'\n      );\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(\n        format.replace(/%s/g, function() { return args[argIndex++]; })\n      );\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n};\n\nmodule.exports = invariant;\n","function _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\n\nmodule.exports = _interopRequireDefault;","// This is extracted to separate module because it's shared\n// between browser and SSR code\nexport const RouteAnnouncerProps = {\n  id: `gatsby-announcer`,\n  style: {\n    position: `absolute`,\n    top: 0,\n    width: 1,\n    height: 1,\n    padding: 0,\n    overflow: `hidden`,\n    clip: `rect(0, 0, 0, 0)`,\n    whiteSpace: `nowrap`,\n    border: 0,\n  },\n  \"aria-live\": `assertive`,\n  \"aria-atomic\": `true`,\n}\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport redirects from \"./redirects.json\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport emitter from \"./emitter\"\nimport { RouteAnnouncerProps } from \"./route-announcer-props\"\nimport { navigate as reachNavigate } from \"@reach/router\"\nimport { globalHistory } from \"@reach/router/lib/history\"\nimport { parsePath } from \"gatsby-link\"\n\n// Convert to a map for faster lookup in maybeRedirect()\nconst redirectMap = redirects.reduce((map, redirect) => {\n  map[redirect.fromPath] = redirect\n  return map\n}, {})\n\nfunction maybeRedirect(pathname) {\n  const redirect = redirectMap[pathname]\n\n  if (redirect != null) {\n    if (process.env.NODE_ENV !== `production`) {\n      if (!loader.isPageNotFound(pathname)) {\n        console.error(\n          `The route \"${pathname}\" matches both a page and a redirect; this is probably not intentional.`\n        )\n      }\n    }\n\n    window.___replace(redirect.toPath)\n    return true\n  } else {\n    return false\n  }\n}\n\nconst onPreRouteUpdate = (location, prevLocation) => {\n  if (!maybeRedirect(location.pathname)) {\n    apiRunner(`onPreRouteUpdate`, { location, prevLocation })\n  }\n}\n\nconst onRouteUpdate = (location, prevLocation) => {\n  if (!maybeRedirect(location.pathname)) {\n    apiRunner(`onRouteUpdate`, { location, prevLocation })\n  }\n}\n\nconst navigate = (to, options = {}) => {\n  // Support forward/backward navigation with numbers\n  // navigate(-2) (jumps back 2 history steps)\n  // navigate(2)  (jumps forward 2 history steps)\n  if (typeof to === `number`) {\n    globalHistory.navigate(to)\n    return\n  }\n\n  let { pathname } = parsePath(to)\n  const redirect = redirectMap[pathname]\n\n  // If we're redirecting, just replace the passed in pathname\n  // to the one we want to redirect to.\n  if (redirect) {\n    to = redirect.toPath\n    pathname = parsePath(to).pathname\n  }\n\n  // If we had a service worker update, no matter the path, reload window and\n  // reset the pathname whitelist\n  if (window.___swUpdated) {\n    window.location = pathname\n    return\n  }\n\n  // Start a timer to wait for a second before transitioning and showing a\n  // loader in case resources aren't around yet.\n  const timeoutId = setTimeout(() => {\n    emitter.emit(`onDelayedLoadPageResources`, { pathname })\n    apiRunner(`onRouteUpdateDelayed`, {\n      location: window.location,\n    })\n  }, 1000)\n\n  loader.loadPage(pathname).then(pageResources => {\n    // If no page resources, then refresh the page\n    // Do this, rather than simply `window.location.reload()`, so that\n    // pressing the back/forward buttons work - otherwise when pressing\n    // back, the browser will just change the URL and expect JS to handle\n    // the change, which won't always work since it might not be a Gatsby\n    // page.\n    if (!pageResources || pageResources.status === PageResourceStatus.Error) {\n      window.history.replaceState({}, ``, location.href)\n      window.location = pathname\n      clearTimeout(timeoutId)\n      return\n    }\n\n    // If the loaded page has a different compilation hash to the\n    // window, then a rebuild has occurred on the server. Reload.\n    if (process.env.NODE_ENV === `production` && pageResources) {\n      if (\n        pageResources.page.webpackCompilationHash !==\n        window.___webpackCompilationHash\n      ) {\n        // Purge plugin-offline cache\n        if (\n          `serviceWorker` in navigator &&\n          navigator.serviceWorker.controller !== null &&\n          navigator.serviceWorker.controller.state === `activated`\n        ) {\n          navigator.serviceWorker.controller.postMessage({\n            gatsbyApi: `clearPathResources`,\n          })\n        }\n\n        console.log(`Site has changed on server. Reloading browser`)\n        window.location = pathname\n      }\n    }\n    reachNavigate(to, options)\n    clearTimeout(timeoutId)\n  })\n}\n\nfunction shouldUpdateScroll(prevRouterProps, { location }) {\n  const { pathname, hash } = location\n  const results = apiRunner(`shouldUpdateScroll`, {\n    prevRouterProps,\n    // `pathname` for backwards compatibility\n    pathname,\n    routerProps: { location },\n    getSavedScrollPosition: args => this._stateStorage.read(args),\n  })\n  if (results.length > 0) {\n    // Use the latest registered shouldUpdateScroll result, this allows users to override plugin's configuration\n    // @see https://github.com/gatsbyjs/gatsby/issues/12038\n    return results[results.length - 1]\n  }\n\n  if (prevRouterProps) {\n    const {\n      location: { pathname: oldPathname },\n    } = prevRouterProps\n    if (oldPathname === pathname) {\n      // Scroll to element if it exists, if it doesn't, or no hash is provided,\n      // scroll to top.\n      return hash ? decodeURI(hash.slice(1)) : [0, 0]\n    }\n  }\n  return true\n}\n\nfunction init() {\n  // The \"scroll-behavior\" package expects the \"action\" to be on the location\n  // object so let's copy it over.\n  globalHistory.listen(args => {\n    args.location.action = args.action\n  })\n\n  window.___push = to => navigate(to, { replace: false })\n  window.___replace = to => navigate(to, { replace: true })\n  window.___navigate = (to, options) => navigate(to, options)\n\n  // Check for initial page-load redirect\n  maybeRedirect(window.location.pathname)\n}\n\nclass RouteAnnouncer extends React.Component {\n  constructor(props) {\n    super(props)\n    this.announcementRef = React.createRef()\n  }\n\n  componentDidUpdate(prevProps, nextProps) {\n    requestAnimationFrame(() => {\n      let pageName = `new page at ${this.props.location.pathname}`\n      if (document.title) {\n        pageName = document.title\n      }\n      const pageHeadings = document.querySelectorAll(`#gatsby-focus-wrapper h1`)\n      if (pageHeadings && pageHeadings.length) {\n        pageName = pageHeadings[0].textContent\n      }\n      const newAnnouncement = `Navigated to ${pageName}`\n      if (this.announcementRef.current) {\n        const oldAnnouncement = this.announcementRef.current.innerText\n        if (oldAnnouncement !== newAnnouncement) {\n          this.announcementRef.current.innerText = newAnnouncement\n        }\n      }\n    })\n  }\n\n  render() {\n    return <div {...RouteAnnouncerProps} ref={this.announcementRef}></div>\n  }\n}\n\n// Fire on(Pre)RouteUpdate APIs\nclass RouteUpdates extends React.Component {\n  constructor(props) {\n    super(props)\n    onPreRouteUpdate(props.location, null)\n  }\n\n  componentDidMount() {\n    onRouteUpdate(this.props.location, null)\n  }\n\n  componentDidUpdate(prevProps, prevState, shouldFireRouteUpdate) {\n    if (shouldFireRouteUpdate) {\n      onRouteUpdate(this.props.location, prevProps.location)\n    }\n  }\n\n  getSnapshotBeforeUpdate(prevProps) {\n    if (this.props.location.pathname !== prevProps.location.pathname) {\n      onPreRouteUpdate(this.props.location, prevProps.location)\n      return true\n    }\n\n    return false\n  }\n\n  render() {\n    return (\n      <React.Fragment>\n        {this.props.children}\n        <RouteAnnouncer location={location} />\n      </React.Fragment>\n    )\n  }\n}\n\nRouteUpdates.propTypes = {\n  location: PropTypes.object.isRequired,\n}\n\nexport { init, shouldUpdateScroll, RouteUpdates }\n","// Pulled from react-compat\n// https://github.com/developit/preact-compat/blob/7c5de00e7c85e2ffd011bf3af02899b63f699d3a/src/index.js#L349\nfunction shallowDiffers(a, b) {\n  for (var i in a) {\n    if (!(i in b)) return true;\n  }for (var _i in b) {\n    if (a[_i] !== b[_i]) return true;\n  }return false;\n}\n\nexport default (function (instance, nextProps, nextState) {\n  return shallowDiffers(instance.props, nextProps) || shallowDiffers(instance.state, nextState);\n});","import React from \"react\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport shallowCompare from \"shallow-compare\"\n\nclass EnsureResources extends React.Component {\n  constructor(props) {\n    super()\n    const { location, pageResources } = props\n    this.state = {\n      location: { ...location },\n      pageResources: pageResources || loader.loadPageSync(location.pathname),\n    }\n  }\n\n  static getDerivedStateFromProps({ location }, prevState) {\n    if (prevState.location.href !== location.href) {\n      const pageResources = loader.loadPageSync(location.pathname)\n      return {\n        pageResources,\n        location: { ...location },\n      }\n    }\n\n    return {\n      location: { ...location },\n    }\n  }\n\n  loadResources(rawPath) {\n    loader.loadPage(rawPath).then(pageResources => {\n      if (pageResources && pageResources.status !== PageResourceStatus.Error) {\n        this.setState({\n          location: { ...window.location },\n          pageResources,\n        })\n      } else {\n        window.history.replaceState({}, ``, location.href)\n        window.location = rawPath\n      }\n    })\n  }\n\n  shouldComponentUpdate(nextProps, nextState) {\n    // Always return false if we're missing resources.\n    if (!nextState.pageResources) {\n      this.loadResources(nextProps.location.pathname)\n      return false\n    }\n\n    // Check if the component or json have changed.\n    if (this.state.pageResources !== nextState.pageResources) {\n      return true\n    }\n    if (\n      this.state.pageResources.component !== nextState.pageResources.component\n    ) {\n      return true\n    }\n\n    if (this.state.pageResources.json !== nextState.pageResources.json) {\n      return true\n    }\n    // Check if location has changed on a page using internal routing\n    // via matchPath configuration.\n    if (\n      this.state.location.key !== nextState.location.key &&\n      nextState.pageResources.page &&\n      (nextState.pageResources.page.matchPath ||\n        nextState.pageResources.page.path)\n    ) {\n      return true\n    }\n    return shallowCompare(this, nextProps, nextState)\n  }\n\n  render() {\n    if (process.env.NODE_ENV !== `production` && !this.state.pageResources) {\n      throw new Error(\n        `EnsureResources was not able to find resources for path: \"${this.props.location.pathname}\"\nThis typically means that an issue occurred building components for that path.\nRun \\`gatsby clean\\` to remove any cached elements.`\n      )\n    }\n\n    return this.props.children(this.state)\n  }\n}\n\nexport default EnsureResources\n","import { apiRunner, apiRunnerAsync } from \"./api-runner-browser\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Router, navigate, Location, BaseContext } from \"@reach/router\"\nimport { ScrollContext } from \"gatsby-react-router-scroll\"\nimport domReady from \"@mikaelkristiansson/domready\"\nimport { StaticQueryContext } from \"gatsby\"\nimport {\n  shouldUpdateScroll,\n  init as navigationInit,\n  RouteUpdates,\n} from \"./navigation\"\nimport emitter from \"./emitter\"\nimport PageRenderer from \"./page-renderer\"\nimport asyncRequires from \"$virtual/async-requires\"\nimport {\n  setLoader,\n  ProdLoader,\n  publicLoader,\n  PageResourceStatus,\n} from \"./loader\"\nimport EnsureResources from \"./ensure-resources\"\nimport stripPrefix from \"./strip-prefix\"\n\n// Generated during bootstrap\nimport matchPaths from \"$virtual/match-paths.json\"\n\nconst loader = new ProdLoader(asyncRequires, matchPaths)\nsetLoader(loader)\nloader.setApiRunner(apiRunner)\n\nwindow.asyncRequires = asyncRequires\nwindow.___emitter = emitter\nwindow.___loader = publicLoader\n\nnavigationInit()\n\napiRunnerAsync(`onClientEntry`).then(() => {\n  // Let plugins register a service worker. The plugin just needs\n  // to return true.\n  if (apiRunner(`registerServiceWorker`).length > 0) {\n    require(`./register-service-worker`)\n  }\n\n  // In gatsby v2 if Router is used in page using matchPaths\n  // paths need to contain full path.\n  // For example:\n  //   - page have `/app/*` matchPath\n  //   - inside template user needs to use `/app/xyz` as path\n  // Resetting `basepath`/`baseuri` keeps current behaviour\n  // to not introduce breaking change.\n  // Remove this in v3\n  const RouteHandler = props => (\n    <BaseContext.Provider\n      value={{\n        baseuri: `/`,\n        basepath: `/`,\n      }}\n    >\n      <PageRenderer {...props} />\n    </BaseContext.Provider>\n  )\n\n  const DataContext = React.createContext({})\n\n  class GatsbyRoot extends React.Component {\n    render() {\n      const { children } = this.props\n      return (\n        <Location>\n          {({ location }) => (\n            <EnsureResources location={location}>\n              {({ pageResources, location }) => (\n                <StaticQueryContext.Provider\n                  value={pageResources.staticQueryResults}\n                >\n                  <DataContext.Provider value={{ pageResources, location }}>\n                    {children}\n                  </DataContext.Provider>\n                </StaticQueryContext.Provider>\n              )}\n            </EnsureResources>\n          )}\n        </Location>\n      )\n    }\n  }\n\n  class LocationHandler extends React.Component {\n    render() {\n      return (\n        <DataContext.Consumer>\n          {({ pageResources, location }) => (\n            <RouteUpdates location={location}>\n              <ScrollContext\n                location={location}\n                shouldUpdateScroll={shouldUpdateScroll}\n              >\n                <Router\n                  basepath={__BASE_PATH__}\n                  location={location}\n                  id=\"gatsby-focus-wrapper\"\n                >\n                  <RouteHandler\n                    path={\n                      pageResources.page.path === `/404.html`\n                        ? stripPrefix(location.pathname, __BASE_PATH__)\n                        : encodeURI(\n                            pageResources.page.matchPath ||\n                              pageResources.page.path\n                          )\n                    }\n                    {...this.props}\n                    location={location}\n                    pageResources={pageResources}\n                    {...pageResources.json}\n                  />\n                </Router>\n              </ScrollContext>\n            </RouteUpdates>\n          )}\n        </DataContext.Consumer>\n      )\n    }\n  }\n\n  const { pagePath, location: browserLoc } = window\n\n  // Explicitly call navigate if the canonical path (window.pagePath)\n  // is different to the browser path (window.location.pathname). But\n  // only if NONE of the following conditions hold:\n  //\n  // - The url matches a client side route (page.matchPath)\n  // - it's a 404 page\n  // - it's the offline plugin shell (/offline-plugin-app-shell-fallback/)\n  if (\n    pagePath &&\n    __BASE_PATH__ + pagePath !== browserLoc.pathname &&\n    !(\n      loader.findMatchPath(stripPrefix(browserLoc.pathname, __BASE_PATH__)) ||\n      pagePath === `/404.html` ||\n      pagePath.match(/^\\/404\\/?$/) ||\n      pagePath.match(/^\\/offline-plugin-app-shell-fallback\\/?$/)\n    )\n  ) {\n    navigate(__BASE_PATH__ + pagePath + browserLoc.search + browserLoc.hash, {\n      replace: true,\n    })\n  }\n\n  publicLoader.loadPage(browserLoc.pathname).then(page => {\n    if (!page || page.status === PageResourceStatus.Error) {\n      throw new Error(\n        `page resources for ${browserLoc.pathname} not found. Not rendering React`\n      )\n    }\n\n    window.___webpackCompilationHash = page.page.webpackCompilationHash\n\n    const SiteRoot = apiRunner(\n      `wrapRootElement`,\n      { element: <LocationHandler /> },\n      <LocationHandler />,\n      ({ result }) => {\n        return { element: result }\n      }\n    ).pop()\n\n    const App = () => <GatsbyRoot>{SiteRoot}</GatsbyRoot>\n\n    const renderer = apiRunner(\n      `replaceHydrateFunction`,\n      undefined,\n      ReactDOM.hydrate\n    )[0]\n\n    domReady(() => {\n      renderer(\n        <App />,\n        typeof window !== `undefined`\n          ? document.getElementById(`___gatsby`)\n          : void 0,\n        () => {\n          apiRunner(`onInitialClientRender`)\n        }\n      )\n    })\n  })\n})\n","function _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}\n\nmodule.exports = _inheritsLoose;","// prefer default export if available\nconst preferDefault = m => m && m.default || m\n\nexports.components = {\n  \"component---src-pages-quickstarts-index-jsx\": () => import(\"./../../src/pages/quickstarts/index.jsx\" /* webpackChunkName: \"component---src-pages-quickstarts-index-jsx\" */),\n  \"component---src-templates-doc-jsx\": () => import(\"./../../src/templates/doc.jsx\" /* webpackChunkName: \"component---src-templates-doc-jsx\" */),\n  \"component---src-templates-main-jsx\": () => import(\"./../../src/templates/main.jsx\" /* webpackChunkName: \"component---src-templates-main-jsx\" */)\n}\n\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport Link, {\n  withPrefix,\n  withAssetPrefix,\n  navigate,\n  push,\n  replace,\n  navigateTo,\n  parsePath,\n} from \"gatsby-link\"\nimport { useScrollRestoration } from \"gatsby-react-router-scroll\"\nimport PageRenderer from \"./public-page-renderer\"\nimport loader from \"./loader\"\n\nconst prefetchPathname = loader.enqueue\n\nconst StaticQueryContext = React.createContext({})\n\nfunction StaticQueryDataRenderer({ staticQueryData, data, query, render }) {\n  const finalData = data\n    ? data.data\n    : staticQueryData[query] && staticQueryData[query].data\n\n  return (\n    <React.Fragment>\n      {finalData && render(finalData)}\n      {!finalData && <div>Loading (StaticQuery)</div>}\n    </React.Fragment>\n  )\n}\n\nconst StaticQuery = props => {\n  const { data, query, render, children } = props\n\n  return (\n    <StaticQueryContext.Consumer>\n      {staticQueryData => (\n        <StaticQueryDataRenderer\n          data={data}\n          query={query}\n          render={render || children}\n          staticQueryData={staticQueryData}\n        />\n      )}\n    </StaticQueryContext.Consumer>\n  )\n}\n\nconst useStaticQuery = query => {\n  if (\n    typeof React.useContext !== `function` &&\n    process.env.NODE_ENV === `development`\n  ) {\n    throw new Error(\n      `You're likely using a version of React that doesn't support Hooks\\n` +\n        `Please update React and ReactDOM to 16.8.0 or later to use the useStaticQuery hook.`\n    )\n  }\n  const context = React.useContext(StaticQueryContext)\n\n  // query is a stringified number like `3303882` when wrapped with graphql, If a user forgets\n  // to wrap the query in a grqphql, then casting it to a Number results in `NaN` allowing us to\n  // catch the misuse of the API and give proper direction\n  if (isNaN(Number(query))) {\n    throw new Error(`useStaticQuery was called with a string but expects to be called using \\`graphql\\`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql\\`${query}\\`);\n`)\n  }\n\n  if (context?.[query]?.data) {\n    return context[query].data\n  } else {\n    throw new Error(\n      `The result of this StaticQuery could not be fetched.\\n\\n` +\n        `This is likely a bug in Gatsby and if refreshing the page does not fix it, ` +\n        `please open an issue in https://github.com/gatsbyjs/gatsby/issues`\n    )\n  }\n}\n\nStaticQuery.propTypes = {\n  data: PropTypes.object,\n  query: PropTypes.string.isRequired,\n  render: PropTypes.func,\n  children: PropTypes.func,\n}\n\nfunction graphql() {\n  throw new Error(\n    `It appears like Gatsby is misconfigured. Gatsby related \\`graphql\\` calls ` +\n      `are supposed to only be evaluated at compile time, and then compiled away. ` +\n      `Unfortunately, something went wrong and the query was left in the compiled code.\\n\\n` +\n      `Unless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.`\n  )\n}\n\nexport {\n  Link,\n  withAssetPrefix,\n  withPrefix,\n  graphql,\n  parsePath,\n  navigate,\n  push, // TODO replace for v3\n  replace, // TODO remove replace for v3\n  navigateTo, // TODO: remove navigateTo for v3\n  useScrollRestoration,\n  StaticQueryContext,\n  StaticQuery,\n  PageRenderer,\n  useStaticQuery,\n  prefetchPathname,\n}\n","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/* eslint-disable jsx-a11y/anchor-has-content */\nimport React, { useContext } from \"react\";\nimport PropTypes from \"prop-types\";\nimport invariant from \"invariant\";\nimport createContext from \"create-react-context\";\nimport { polyfill } from \"react-lifecycles-compat\";\nimport { startsWith, pick, resolve, match, insertParams, validateRedirect, shallowCompare } from \"./lib/utils\";\nimport { globalHistory, navigate, createHistory, createMemorySource } from \"./lib/history\";\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar createNamedContext = function createNamedContext(name, defaultValue) {\n  var Ctx = createContext(defaultValue);\n  Ctx.displayName = name;\n  return Ctx;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Location Context/Provider\nvar LocationContext = createNamedContext(\"Location\");\n\n// sets up a listener if there isn't one already so apps don't need to be\n// wrapped in some top level provider\nvar Location = function Location(_ref) {\n  var children = _ref.children;\n  return React.createElement(\n    LocationContext.Consumer,\n    null,\n    function (context) {\n      return context ? children(context) : React.createElement(\n        LocationProvider,\n        null,\n        children\n      );\n    }\n  );\n};\n\nvar LocationProvider = function (_React$Component) {\n  _inherits(LocationProvider, _React$Component);\n\n  function LocationProvider() {\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, LocationProvider);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n      context: _this.getContext(),\n      refs: { unlisten: null }\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  LocationProvider.prototype.getContext = function getContext() {\n    var _props$history = this.props.history,\n        navigate = _props$history.navigate,\n        location = _props$history.location;\n\n    return { navigate: navigate, location: location };\n  };\n\n  LocationProvider.prototype.componentDidCatch = function componentDidCatch(error, info) {\n    if (isRedirect(error)) {\n      var _navigate = this.props.history.navigate;\n\n      _navigate(error.uri, { replace: true });\n    } else {\n      throw error;\n    }\n  };\n\n  LocationProvider.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    if (prevState.context.location !== this.state.context.location) {\n      this.props.history._onTransitionComplete();\n    }\n  };\n\n  LocationProvider.prototype.componentDidMount = function componentDidMount() {\n    var _this2 = this;\n\n    var refs = this.state.refs,\n        history = this.props.history;\n\n    history._onTransitionComplete();\n    refs.unlisten = history.listen(function () {\n      Promise.resolve().then(function () {\n        // TODO: replace rAF with react deferred update API when it's ready https://github.com/facebook/react/issues/13306\n        requestAnimationFrame(function () {\n          if (!_this2.unmounted) {\n            _this2.setState(function () {\n              return { context: _this2.getContext() };\n            });\n          }\n        });\n      });\n    });\n  };\n\n  LocationProvider.prototype.componentWillUnmount = function componentWillUnmount() {\n    var refs = this.state.refs;\n\n    this.unmounted = true;\n    refs.unlisten();\n  };\n\n  LocationProvider.prototype.render = function render() {\n    var context = this.state.context,\n        children = this.props.children;\n\n    return React.createElement(\n      LocationContext.Provider,\n      { value: context },\n      typeof children === \"function\" ? children(context) : children || null\n    );\n  };\n\n  return LocationProvider;\n}(React.Component);\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nLocationProvider.defaultProps = {\n  history: globalHistory\n};\nprocess.env.NODE_ENV !== \"production\" ? LocationProvider.propTypes = {\n  history: PropTypes.object.isRequired\n} : void 0;\nvar ServerLocation = function ServerLocation(_ref2) {\n  var url = _ref2.url,\n      children = _ref2.children;\n\n  var searchIndex = url.indexOf(\"?\");\n  var searchExists = searchIndex > -1;\n  var pathname = void 0;\n  var search = \"\";\n  var hash = \"\";\n\n  if (searchExists) {\n    pathname = url.substring(0, searchIndex);\n    search = url.substring(searchIndex);\n  } else {\n    pathname = url;\n  }\n\n  return React.createElement(\n    LocationContext.Provider,\n    {\n      value: {\n        location: {\n          pathname: pathname,\n          search: search,\n          hash: hash\n        },\n        navigate: function navigate() {\n          throw new Error(\"You can't call navigate on the server.\");\n        }\n      }\n    },\n    children\n  );\n};\n////////////////////////////////////////////////////////////////////////////////\n// Sets baseuri and basepath for nested routers and links\nvar BaseContext = createNamedContext(\"Base\", { baseuri: \"/\", basepath: \"/\" });\n\n////////////////////////////////////////////////////////////////////////////////\n// The main event, welcome to the show everybody.\nvar Router = function Router(props) {\n  return React.createElement(\n    BaseContext.Consumer,\n    null,\n    function (baseContext) {\n      return React.createElement(\n        Location,\n        null,\n        function (locationContext) {\n          return React.createElement(RouterImpl, _extends({}, baseContext, locationContext, props));\n        }\n      );\n    }\n  );\n};\n\nvar RouterImpl = function (_React$PureComponent) {\n  _inherits(RouterImpl, _React$PureComponent);\n\n  function RouterImpl() {\n    _classCallCheck(this, RouterImpl);\n\n    return _possibleConstructorReturn(this, _React$PureComponent.apply(this, arguments));\n  }\n\n  RouterImpl.prototype.render = function render() {\n    var _props = this.props,\n        location = _props.location,\n        _navigate2 = _props.navigate,\n        basepath = _props.basepath,\n        primary = _props.primary,\n        children = _props.children,\n        baseuri = _props.baseuri,\n        _props$component = _props.component,\n        component = _props$component === undefined ? \"div\" : _props$component,\n        domProps = _objectWithoutProperties(_props, [\"location\", \"navigate\", \"basepath\", \"primary\", \"children\", \"baseuri\", \"component\"]);\n\n    var routes = React.Children.toArray(children).reduce(function (array, child) {\n      var routes = createRoute(basepath)(child);\n      return array.concat(routes);\n    }, []);\n    var pathname = location.pathname;\n\n\n    var match = pick(routes, pathname);\n\n    if (match) {\n      var params = match.params,\n          uri = match.uri,\n          route = match.route,\n          element = match.route.value;\n\n      // remove the /* from the end for child routes relative paths\n\n      basepath = route.default ? basepath : route.path.replace(/\\*$/, \"\");\n\n      var props = _extends({}, params, {\n        uri: uri,\n        location: location,\n        navigate: function navigate(to, options) {\n          return _navigate2(resolve(to, uri), options);\n        }\n      });\n\n      var clone = React.cloneElement(element, props, element.props.children ? React.createElement(\n        Router,\n        { location: location, primary: primary },\n        element.props.children\n      ) : undefined);\n\n      // using 'div' for < 16.3 support\n      var FocusWrapper = primary ? FocusHandler : component;\n      // don't pass any props to 'div'\n      var wrapperProps = primary ? _extends({ uri: uri, location: location, component: component }, domProps) : domProps;\n\n      return React.createElement(\n        BaseContext.Provider,\n        { value: { baseuri: uri, basepath: basepath } },\n        React.createElement(\n          FocusWrapper,\n          wrapperProps,\n          clone\n        )\n      );\n    } else {\n      // Not sure if we want this, would require index routes at every level\n      // warning(\n      //   false,\n      //   `<Router basepath=\"${basepath}\">\\n\\nNothing matched:\\n\\t${\n      //     location.pathname\n      //   }\\n\\nPaths checked: \\n\\t${routes\n      //     .map(route => route.path)\n      //     .join(\n      //       \"\\n\\t\"\n      //     )}\\n\\nTo get rid of this warning, add a default NotFound component as child of Router:\n      //   \\n\\tlet NotFound = () => <div>Not Found!</div>\n      //   \\n\\t<Router>\\n\\t  <NotFound default/>\\n\\t  {/* ... */}\\n\\t</Router>`\n      // );\n      return null;\n    }\n  };\n\n  return RouterImpl;\n}(React.PureComponent);\n\nRouterImpl.defaultProps = {\n  primary: true\n};\n\n\nvar FocusContext = createNamedContext(\"Focus\");\n\nvar FocusHandler = function FocusHandler(_ref3) {\n  var uri = _ref3.uri,\n      location = _ref3.location,\n      component = _ref3.component,\n      domProps = _objectWithoutProperties(_ref3, [\"uri\", \"location\", \"component\"]);\n\n  return React.createElement(\n    FocusContext.Consumer,\n    null,\n    function (requestFocus) {\n      return React.createElement(FocusHandlerImpl, _extends({}, domProps, {\n        component: component,\n        requestFocus: requestFocus,\n        uri: uri,\n        location: location\n      }));\n    }\n  );\n};\n\n// don't focus on initial render\nvar initialRender = true;\nvar focusHandlerCount = 0;\n\nvar FocusHandlerImpl = function (_React$Component2) {\n  _inherits(FocusHandlerImpl, _React$Component2);\n\n  function FocusHandlerImpl() {\n    var _temp2, _this4, _ret2;\n\n    _classCallCheck(this, FocusHandlerImpl);\n\n    for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    return _ret2 = (_temp2 = (_this4 = _possibleConstructorReturn(this, _React$Component2.call.apply(_React$Component2, [this].concat(args))), _this4), _this4.state = {}, _this4.requestFocus = function (node) {\n      if (!_this4.state.shouldFocus && node) {\n        node.focus();\n      }\n    }, _temp2), _possibleConstructorReturn(_this4, _ret2);\n  }\n\n  FocusHandlerImpl.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n    var initial = prevState.uri == null;\n    if (initial) {\n      return _extends({\n        shouldFocus: true\n      }, nextProps);\n    } else {\n      var myURIChanged = nextProps.uri !== prevState.uri;\n      var navigatedUpToMe = prevState.location.pathname !== nextProps.location.pathname && nextProps.location.pathname === nextProps.uri;\n      return _extends({\n        shouldFocus: myURIChanged || navigatedUpToMe\n      }, nextProps);\n    }\n  };\n\n  FocusHandlerImpl.prototype.componentDidMount = function componentDidMount() {\n    focusHandlerCount++;\n    this.focus();\n  };\n\n  FocusHandlerImpl.prototype.componentWillUnmount = function componentWillUnmount() {\n    focusHandlerCount--;\n    if (focusHandlerCount === 0) {\n      initialRender = true;\n    }\n  };\n\n  FocusHandlerImpl.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    if (prevProps.location !== this.props.location && this.state.shouldFocus) {\n      this.focus();\n    }\n  };\n\n  FocusHandlerImpl.prototype.focus = function focus() {\n    if (process.env.NODE_ENV === \"test\") {\n      // getting cannot read property focus of null in the tests\n      // and that bit of global `initialRender` state causes problems\n      // should probably figure it out!\n      return;\n    }\n\n    var requestFocus = this.props.requestFocus;\n\n\n    if (requestFocus) {\n      requestFocus(this.node);\n    } else {\n      if (initialRender) {\n        initialRender = false;\n      } else if (this.node) {\n        // React polyfills [autofocus] and it fires earlier than cDM,\n        // so we were stealing focus away, this line prevents that.\n        if (!this.node.contains(document.activeElement)) {\n          this.node.focus();\n        }\n      }\n    }\n  };\n\n  FocusHandlerImpl.prototype.render = function render() {\n    var _this5 = this;\n\n    var _props2 = this.props,\n        children = _props2.children,\n        style = _props2.style,\n        requestFocus = _props2.requestFocus,\n        _props2$component = _props2.component,\n        Comp = _props2$component === undefined ? \"div\" : _props2$component,\n        uri = _props2.uri,\n        location = _props2.location,\n        domProps = _objectWithoutProperties(_props2, [\"children\", \"style\", \"requestFocus\", \"component\", \"uri\", \"location\"]);\n\n    return React.createElement(\n      Comp,\n      _extends({\n        style: _extends({ outline: \"none\" }, style),\n        tabIndex: \"-1\",\n        ref: function ref(n) {\n          return _this5.node = n;\n        }\n      }, domProps),\n      React.createElement(\n        FocusContext.Provider,\n        { value: this.requestFocus },\n        this.props.children\n      )\n    );\n  };\n\n  return FocusHandlerImpl;\n}(React.Component);\n\npolyfill(FocusHandlerImpl);\n\nvar k = function k() {};\n\n////////////////////////////////////////////////////////////////////////////////\nvar forwardRef = React.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n  forwardRef = function forwardRef(C) {\n    return C;\n  };\n}\n\nvar Link = forwardRef(function (_ref4, ref) {\n  var innerRef = _ref4.innerRef,\n      props = _objectWithoutProperties(_ref4, [\"innerRef\"]);\n\n  return React.createElement(\n    BaseContext.Consumer,\n    null,\n    function (_ref5) {\n      var basepath = _ref5.basepath,\n          baseuri = _ref5.baseuri;\n      return React.createElement(\n        Location,\n        null,\n        function (_ref6) {\n          var location = _ref6.location,\n              navigate = _ref6.navigate;\n\n          var to = props.to,\n              state = props.state,\n              replace = props.replace,\n              _props$getProps = props.getProps,\n              getProps = _props$getProps === undefined ? k : _props$getProps,\n              anchorProps = _objectWithoutProperties(props, [\"to\", \"state\", \"replace\", \"getProps\"]);\n\n          var href = resolve(to, baseuri);\n          var encodedHref = encodeURI(href);\n          var isCurrent = location.pathname === encodedHref;\n          var isPartiallyCurrent = startsWith(location.pathname, encodedHref);\n\n          return React.createElement(\"a\", _extends({\n            ref: ref || innerRef,\n            \"aria-current\": isCurrent ? \"page\" : undefined\n          }, anchorProps, getProps({ isCurrent: isCurrent, isPartiallyCurrent: isPartiallyCurrent, href: href, location: location }), {\n            href: href,\n            onClick: function onClick(event) {\n              if (anchorProps.onClick) anchorProps.onClick(event);\n              if (shouldNavigate(event)) {\n                event.preventDefault();\n                var shouldReplace = replace;\n                if (typeof replace !== \"boolean\" && isCurrent) {\n                  var _location$state = _extends({}, location.state),\n                      key = _location$state.key,\n                      restState = _objectWithoutProperties(_location$state, [\"key\"]);\n\n                  shouldReplace = shallowCompare(_extends({}, state), restState);\n                }\n                navigate(href, {\n                  state: state,\n                  replace: shouldReplace\n                });\n              }\n            }\n          }));\n        }\n      );\n    }\n  );\n});\n\nLink.displayName = \"Link\";\n\nprocess.env.NODE_ENV !== \"production\" ? Link.propTypes = {\n  to: PropTypes.string.isRequired\n} : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nfunction RedirectRequest(uri) {\n  this.uri = uri;\n}\n\nvar isRedirect = function isRedirect(o) {\n  return o instanceof RedirectRequest;\n};\n\nvar redirectTo = function redirectTo(to) {\n  throw new RedirectRequest(to);\n};\n\nvar RedirectImpl = function (_React$Component3) {\n  _inherits(RedirectImpl, _React$Component3);\n\n  function RedirectImpl() {\n    _classCallCheck(this, RedirectImpl);\n\n    return _possibleConstructorReturn(this, _React$Component3.apply(this, arguments));\n  }\n\n  // Support React < 16 with this hook\n  RedirectImpl.prototype.componentDidMount = function componentDidMount() {\n    var _props3 = this.props,\n        navigate = _props3.navigate,\n        to = _props3.to,\n        from = _props3.from,\n        _props3$replace = _props3.replace,\n        replace = _props3$replace === undefined ? true : _props3$replace,\n        state = _props3.state,\n        noThrow = _props3.noThrow,\n        baseuri = _props3.baseuri,\n        props = _objectWithoutProperties(_props3, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n    Promise.resolve().then(function () {\n      var resolvedTo = resolve(to, baseuri);\n      navigate(insertParams(resolvedTo, props), { replace: replace, state: state });\n    });\n  };\n\n  RedirectImpl.prototype.render = function render() {\n    var _props4 = this.props,\n        navigate = _props4.navigate,\n        to = _props4.to,\n        from = _props4.from,\n        replace = _props4.replace,\n        state = _props4.state,\n        noThrow = _props4.noThrow,\n        baseuri = _props4.baseuri,\n        props = _objectWithoutProperties(_props4, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n    var resolvedTo = resolve(to, baseuri);\n    if (!noThrow) redirectTo(insertParams(resolvedTo, props));\n    return null;\n  };\n\n  return RedirectImpl;\n}(React.Component);\n\nvar Redirect = function Redirect(props) {\n  return React.createElement(\n    BaseContext.Consumer,\n    null,\n    function (_ref7) {\n      var baseuri = _ref7.baseuri;\n      return React.createElement(\n        Location,\n        null,\n        function (locationContext) {\n          return React.createElement(RedirectImpl, _extends({}, locationContext, { baseuri: baseuri }, props));\n        }\n      );\n    }\n  );\n};\n\nprocess.env.NODE_ENV !== \"production\" ? Redirect.propTypes = {\n  from: PropTypes.string,\n  to: PropTypes.string.isRequired\n} : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nvar Match = function Match(_ref8) {\n  var path = _ref8.path,\n      children = _ref8.children;\n  return React.createElement(\n    BaseContext.Consumer,\n    null,\n    function (_ref9) {\n      var baseuri = _ref9.baseuri;\n      return React.createElement(\n        Location,\n        null,\n        function (_ref10) {\n          var navigate = _ref10.navigate,\n              location = _ref10.location;\n\n          var resolvedPath = resolve(path, baseuri);\n          var result = match(resolvedPath, location.pathname);\n          return children({\n            navigate: navigate,\n            location: location,\n            match: result ? _extends({}, result.params, {\n              uri: result.uri,\n              path: path\n            }) : null\n          });\n        }\n      );\n    }\n  );\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Hooks\n\nvar useLocation = function useLocation() {\n  var context = useContext(LocationContext);\n\n  if (!context) {\n    throw new Error(\"useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  return context.location;\n};\n\nvar useNavigate = function useNavigate() {\n  var context = useContext(LocationContext);\n\n  if (!context) {\n    throw new Error(\"useNavigate hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  return context.navigate;\n};\n\nvar useParams = function useParams() {\n  var context = useContext(BaseContext);\n\n  if (!context) {\n    throw new Error(\"useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  var location = useLocation();\n\n  var results = match(context.basepath, location.pathname);\n\n  return results ? results.params : null;\n};\n\nvar useMatch = function useMatch(path) {\n  if (!path) {\n    throw new Error(\"useMatch(path: string) requires an argument of a string to match against\");\n  }\n  var context = useContext(BaseContext);\n\n  if (!context) {\n    throw new Error(\"useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  var location = useLocation();\n\n  var resolvedPath = resolve(path, context.baseuri);\n  var result = match(resolvedPath, location.pathname);\n  return result ? _extends({}, result.params, {\n    uri: result.uri,\n    path: path\n  }) : null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar stripSlashes = function stripSlashes(str) {\n  return str.replace(/(^\\/+|\\/+$)/g, \"\");\n};\n\nvar createRoute = function createRoute(basepath) {\n  return function (element) {\n    if (!element) {\n      return null;\n    }\n\n    if (element.type === React.Fragment && element.props.children) {\n      return React.Children.map(element.props.children, createRoute(basepath));\n    }\n    !(element.props.path || element.props.default || element.type === Redirect) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"<Router>: Children of <Router> must have a `path` or `default` prop, or be a `<Redirect>`. None found on element type `\" + element.type + \"`\") : invariant(false) : void 0;\n\n    !!(element.type === Redirect && (!element.props.from || !element.props.to)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"<Redirect from=\\\"\" + element.props.from + \"\\\" to=\\\"\" + element.props.to + \"\\\"/> requires both \\\"from\\\" and \\\"to\\\" props when inside a <Router>.\") : invariant(false) : void 0;\n\n    !!(element.type === Redirect && !validateRedirect(element.props.from, element.props.to)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"<Redirect from=\\\"\" + element.props.from + \" to=\\\"\" + element.props.to + \"\\\"/> has mismatched dynamic segments, ensure both paths have the exact same dynamic segments.\") : invariant(false) : void 0;\n\n    if (element.props.default) {\n      return { value: element, default: true };\n    }\n\n    var elementPath = element.type === Redirect ? element.props.from : element.props.path;\n\n    var path = elementPath === \"/\" ? basepath : stripSlashes(basepath) + \"/\" + stripSlashes(elementPath);\n\n    return {\n      value: element,\n      default: element.props.default,\n      path: element.props.children ? stripSlashes(path) + \"/*\" : path\n    };\n  };\n};\n\nvar shouldNavigate = function shouldNavigate(event) {\n  return !event.defaultPrevented && event.button === 0 && !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n};\n\n////////////////////////////////////////////////////////////////////////\nexport {  Link, Location, LocationProvider, Match, Redirect, Router, ServerLocation, createHistory, createMemorySource, isRedirect, navigate, redirectTo, globalHistory, match as matchPath, useLocation, useNavigate, useParams, useMatch , BaseContext };","function _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    module.exports = _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    module.exports = _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nmodule.exports = _typeof;","/**\n * Remove a prefix from a string. Return the input string if the given prefix\n * isn't found.\n */\n\nexport default function stripPrefix(str, prefix = ``) {\n  if (!prefix) {\n    return str\n  }\n\n  if (str === prefix) {\n    return `/`\n  }\n\n  if (str.startsWith(`${prefix}/`)) {\n    return str.slice(prefix.length)\n  }\n\n  return str\n}\n","\"use strict\";\n\nexports.__esModule = true;\nexports.parsePath = parsePath;\n\nfunction parsePath(path) {\n  var pathname = path || \"/\";\n  var search = \"\";\n  var hash = \"\";\n  var hashIndex = pathname.indexOf(\"#\");\n\n  if (hashIndex !== -1) {\n    hash = pathname.substr(hashIndex);\n    pathname = pathname.substr(0, hashIndex);\n  }\n\n  var searchIndex = pathname.indexOf(\"?\");\n\n  if (searchIndex !== -1) {\n    search = pathname.substr(searchIndex);\n    pathname = pathname.substr(0, searchIndex);\n  }\n\n  return {\n    pathname: pathname,\n    search: search === \"?\" ? \"\" : search,\n    hash: hash === \"#\" ? \"\" : hash\n  };\n}","export default function _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}","export default function _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) {\n    arr2[i] = arr[i];\n  }\n\n  return arr2;\n}","import arrayWithoutHoles from \"./arrayWithoutHoles\";\nimport iterableToArray from \"./iterableToArray\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray\";\nimport nonIterableSpread from \"./nonIterableSpread\";\nexport default function _toConsumableArray(arr) {\n  return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray\";\nexport default function _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}","import arrayLikeToArray from \"./arrayLikeToArray\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","const support = function (feature) {\n  if (typeof document === `undefined`) {\n    return false\n  }\n  const fakeLink = document.createElement(`link`)\n  try {\n    if (fakeLink.relList && typeof fakeLink.relList.supports === `function`) {\n      return fakeLink.relList.supports(feature)\n    }\n  } catch (err) {\n    return false\n  }\n  return false\n}\n\nconst linkPrefetchStrategy = function (url, options) {\n  return new Promise((resolve, reject) => {\n    if (typeof document === `undefined`) {\n      reject()\n      return\n    }\n\n    const link = document.createElement(`link`)\n    link.setAttribute(`rel`, `prefetch`)\n    link.setAttribute(`href`, url)\n\n    Object.keys(options).forEach(key => {\n      link.setAttribute(key, options[key])\n    })\n\n    link.onload = resolve\n    link.onerror = reject\n\n    const parentElement =\n      document.getElementsByTagName(`head`)[0] ||\n      document.getElementsByName(`script`)[0].parentNode\n    parentElement.appendChild(link)\n  })\n}\n\nconst xhrPrefetchStrategy = function (url) {\n  return new Promise((resolve, reject) => {\n    const req = new XMLHttpRequest()\n    req.open(`GET`, url, true)\n\n    req.onload = () => {\n      if (req.status === 200) {\n        resolve()\n      } else {\n        reject()\n      }\n    }\n\n    req.send(null)\n  })\n}\n\nconst supportedPrefetchStrategy = support(`prefetch`)\n  ? linkPrefetchStrategy\n  : xhrPrefetchStrategy\n\nconst preFetched = {}\n\nconst prefetch = function (url, options) {\n  return new Promise(resolve => {\n    if (preFetched[url]) {\n      resolve()\n      return\n    }\n\n    supportedPrefetchStrategy(url, options)\n      .then(() => {\n        resolve()\n        preFetched[url] = true\n      })\n      .catch(() => {}) // 404s are logged to the console anyway\n  })\n}\n\nexport default prefetch\n","export default path => {\n  if (path === undefined) {\n    return path\n  }\n  if (path === `/`) {\n    return `/`\n  }\n  if (path.charAt(path.length - 1) === `/`) {\n    return path.slice(0, -1)\n  }\n  return path\n}\n","import { match } from \"@reach/router/lib/utils\"\nimport stripPrefix from \"./strip-prefix\"\nimport normalizePagePath from \"./normalize-page-path\"\n\nconst pathCache = new Map()\nlet matchPaths = []\n\nconst trimPathname = rawPathname => {\n  const pathname = decodeURIComponent(rawPathname)\n  // Remove the pathPrefix from the pathname.\n  const trimmedPathname = stripPrefix(pathname, __BASE_PATH__)\n    // Remove any hashfragment\n    .split(`#`)[0]\n    // Remove search query\n    .split(`?`)[0]\n\n  return trimmedPathname\n}\n\nfunction absolutify(path) {\n  // If it's already absolute, return as-is\n  if (\n    path.startsWith(`/`) ||\n    path.startsWith(`https://`) ||\n    path.startsWith(`http://`)\n  ) {\n    return path\n  }\n  // Calculate path relative to current location, adding a trailing slash to\n  // match behavior of @reach/router\n  return new URL(\n    path,\n    window.location.href + (window.location.href.endsWith(`/`) ? `` : `/`)\n  ).pathname\n}\n\n/**\n * Set list of matchPaths\n *\n * @param {Array<{path: string, matchPath: string}>} value collection of matchPaths\n */\nexport const setMatchPaths = value => {\n  matchPaths = value\n}\n\n/**\n * Return a matchpath url\n * if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n * `/foo?bar=far` => `/page1`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string|null}\n */\nexport const findMatchPath = rawPathname => {\n  const trimmedPathname = cleanPath(rawPathname)\n\n  for (const { matchPath, path } of matchPaths) {\n    if (match(matchPath, trimmedPathname)) {\n      return normalizePagePath(path)\n    }\n  }\n\n  return null\n}\n\n// Given a raw URL path, returns the cleaned version of it (trim off\n// `#` and query params), or if it matches an entry in\n// `match-paths.json`, its matched path is returned\n//\n// E.g. `/foo?bar=far` => `/foo`\n//\n// Or if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n// `/foo?bar=far` => `/page1`\nexport const findPath = rawPathname => {\n  const trimmedPathname = trimPathname(absolutify(rawPathname))\n  if (pathCache.has(trimmedPathname)) {\n    return pathCache.get(trimmedPathname)\n  }\n\n  let foundPath = findMatchPath(trimmedPathname)\n\n  if (!foundPath) {\n    foundPath = cleanPath(rawPathname)\n  }\n\n  pathCache.set(trimmedPathname, foundPath)\n\n  return foundPath\n}\n\n/**\n * Clean a url and converts /index.html => /\n * E.g. `/foo?bar=far` => `/foo`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string}\n */\nexport const cleanPath = rawPathname => {\n  const trimmedPathname = trimPathname(absolutify(rawPathname))\n\n  let foundPath = trimmedPathname\n  if (foundPath === `/index.html`) {\n    foundPath = `/`\n  }\n\n  foundPath = normalizePagePath(foundPath)\n\n  return foundPath\n}\n","import prefetchHelper from \"./prefetch\"\nimport emitter from \"./emitter\"\nimport { setMatchPaths, findPath, findMatchPath } from \"./find-path\"\n\n/**\n * Available resource loading statuses\n */\nexport const PageResourceStatus = {\n  /**\n   * At least one of critical resources failed to load\n   */\n  Error: `error`,\n  /**\n   * Resources loaded successfully\n   */\n  Success: `success`,\n}\n\nconst preferDefault = m => (m && m.default) || m\n\nconst stripSurroundingSlashes = s => {\n  s = s[0] === `/` ? s.slice(1) : s\n  s = s.endsWith(`/`) ? s.slice(0, -1) : s\n  return s\n}\n\nconst createPageDataUrl = path => {\n  const fixedPath = path === `/` ? `index` : stripSurroundingSlashes(path)\n  return `${__PATH_PREFIX__}/page-data/${fixedPath}/page-data.json`\n}\n\nfunction doFetch(url, method = `GET`) {\n  return new Promise((resolve, reject) => {\n    const req = new XMLHttpRequest()\n    req.open(method, url, true)\n    req.onreadystatechange = () => {\n      if (req.readyState == 4) {\n        resolve(req)\n      }\n    }\n    req.send(null)\n  })\n}\n\nconst doesConnectionSupportPrefetch = () => {\n  if (\n    `connection` in navigator &&\n    typeof navigator.connection !== `undefined`\n  ) {\n    if ((navigator.connection.effectiveType || ``).includes(`2g`)) {\n      return false\n    }\n    if (navigator.connection.saveData) {\n      return false\n    }\n  }\n  return true\n}\n\nconst toPageResources = (pageData, component = null) => {\n  const page = {\n    componentChunkName: pageData.componentChunkName,\n    path: pageData.path,\n    webpackCompilationHash: pageData.webpackCompilationHash,\n    matchPath: pageData.matchPath,\n    staticQueryHashes: pageData.staticQueryHashes,\n  }\n\n  return {\n    component,\n    json: pageData.result,\n    page,\n  }\n}\n\nexport class BaseLoader {\n  constructor(loadComponent, matchPaths) {\n    // Map of pagePath -> Page. Where Page is an object with: {\n    //   status: PageResourceStatus.Success || PageResourceStatus.Error,\n    //   payload: PageResources, // undefined if PageResourceStatus.Error\n    // }\n    // PageResources is {\n    //   component,\n    //   json: pageData.result,\n    //   page: {\n    //     componentChunkName,\n    //     path,\n    //     webpackCompilationHash,\n    //     staticQueryHashes\n    //   },\n    //   staticQueryResults\n    // }\n    this.pageDb = new Map()\n    this.inFlightDb = new Map()\n    this.staticQueryDb = new Map()\n    this.pageDataDb = new Map()\n    this.prefetchTriggered = new Set()\n    this.prefetchCompleted = new Set()\n    this.loadComponent = loadComponent\n    setMatchPaths(matchPaths)\n  }\n\n  inFlightNetworkRequests = new Map()\n\n  memoizedGet(url) {\n    let inFlightPromise = this.inFlightNetworkRequests.get(url)\n\n    if (!inFlightPromise) {\n      inFlightPromise = doFetch(url, `GET`)\n      this.inFlightNetworkRequests.set(url, inFlightPromise)\n    }\n\n    // Prefer duplication with then + catch over .finally to prevent problems in ie11 + firefox\n    return inFlightPromise\n      .then(response => {\n        this.inFlightNetworkRequests.delete(url)\n        return response\n      })\n      .catch(err => {\n        this.inFlightNetworkRequests.delete(url)\n        throw err\n      })\n  }\n\n  setApiRunner(apiRunner) {\n    this.apiRunner = apiRunner\n    this.prefetchDisabled = apiRunner(`disableCorePrefetching`).some(a => a)\n  }\n\n  fetchPageDataJson(loadObj) {\n    const { pagePath, retries = 0 } = loadObj\n    const url = createPageDataUrl(pagePath)\n    return this.memoizedGet(url).then(req => {\n      const { status, responseText } = req\n\n      // Handle 200\n      if (status === 200) {\n        try {\n          const jsonPayload = JSON.parse(responseText)\n          if (jsonPayload.path === undefined) {\n            throw new Error(`not a valid pageData response`)\n          }\n\n          return Object.assign(loadObj, {\n            status: PageResourceStatus.Success,\n            payload: jsonPayload,\n          })\n        } catch (err) {\n          // continue regardless of error\n        }\n      }\n\n      // Handle 404\n      if (status === 404 || status === 200) {\n        // If the request was for a 404 page and it doesn't exist, we're done\n        if (pagePath === `/404.html`) {\n          return Object.assign(loadObj, {\n            status: PageResourceStatus.Error,\n          })\n        }\n\n        // Need some code here to cache the 404 request. In case\n        // multiple loadPageDataJsons result in 404s\n        return this.fetchPageDataJson(\n          Object.assign(loadObj, { pagePath: `/404.html`, notFound: true })\n        )\n      }\n\n      // handle 500 response (Unrecoverable)\n      if (status === 500) {\n        return Object.assign(loadObj, {\n          status: PageResourceStatus.Error,\n        })\n      }\n\n      // Handle everything else, including status === 0, and 503s. Should retry\n      if (retries < 3) {\n        return this.fetchPageDataJson(\n          Object.assign(loadObj, { retries: retries + 1 })\n        )\n      }\n\n      // Retried 3 times already, result is an error.\n      return Object.assign(loadObj, {\n        status: PageResourceStatus.Error,\n      })\n    })\n  }\n\n  loadPageDataJson(rawPath) {\n    const pagePath = findPath(rawPath)\n    if (this.pageDataDb.has(pagePath)) {\n      return Promise.resolve(this.pageDataDb.get(pagePath))\n    }\n\n    return this.fetchPageDataJson({ pagePath }).then(pageData => {\n      this.pageDataDb.set(pagePath, pageData)\n\n      return pageData\n    })\n  }\n\n  findMatchPath(rawPath) {\n    return findMatchPath(rawPath)\n  }\n\n  // TODO check all uses of this and whether they use undefined for page resources not exist\n  loadPage(rawPath) {\n    const pagePath = findPath(rawPath)\n    if (this.pageDb.has(pagePath)) {\n      const page = this.pageDb.get(pagePath)\n      return Promise.resolve(page.payload)\n    }\n\n    if (this.inFlightDb.has(pagePath)) {\n      return this.inFlightDb.get(pagePath)\n    }\n\n    const inFlightPromise = Promise.all([\n      this.loadAppData(),\n      this.loadPageDataJson(pagePath),\n    ]).then(allData => {\n      const result = allData[1]\n      if (result.status === PageResourceStatus.Error) {\n        return {\n          status: PageResourceStatus.Error,\n        }\n      }\n\n      let pageData = result.payload\n      const { componentChunkName, staticQueryHashes = [] } = pageData\n\n      const finalResult = {}\n\n      const componentChunkPromise = this.loadComponent(componentChunkName).then(\n        component => {\n          finalResult.createdAt = new Date()\n          let pageResources\n          if (!component) {\n            finalResult.status = PageResourceStatus.Error\n          } else {\n            finalResult.status = PageResourceStatus.Success\n            if (result.notFound === true) {\n              finalResult.notFound = true\n            }\n            pageData = Object.assign(pageData, {\n              webpackCompilationHash: allData[0]\n                ? allData[0].webpackCompilationHash\n                : ``,\n            })\n            pageResources = toPageResources(pageData, component)\n          }\n          // undefined if final result is an error\n          return pageResources\n        }\n      )\n\n      const staticQueryBatchPromise = Promise.all(\n        staticQueryHashes.map(staticQueryHash => {\n          // Check for cache in case this static query result has already been loaded\n          if (this.staticQueryDb.has(staticQueryHash)) {\n            const jsonPayload = this.staticQueryDb.get(staticQueryHash)\n            return { staticQueryHash, jsonPayload }\n          }\n\n          return this.memoizedGet(\n            `${__PATH_PREFIX__}/static/d/${staticQueryHash}.json`\n          ).then(req => {\n            const jsonPayload = JSON.parse(req.responseText)\n            return { staticQueryHash, jsonPayload }\n          })\n        })\n      ).then(staticQueryResults => {\n        const staticQueryResultsMap = {}\n\n        staticQueryResults.forEach(({ staticQueryHash, jsonPayload }) => {\n          staticQueryResultsMap[staticQueryHash] = jsonPayload\n          this.staticQueryDb.set(staticQueryHash, jsonPayload)\n        })\n\n        return staticQueryResultsMap\n      })\n\n      return Promise.all([componentChunkPromise, staticQueryBatchPromise]).then(\n        ([pageResources, staticQueryResults]) => {\n          let payload\n          if (pageResources) {\n            payload = { ...pageResources, staticQueryResults }\n            finalResult.payload = payload\n            emitter.emit(`onPostLoadPageResources`, {\n              page: payload,\n              pageResources: payload,\n            })\n          }\n\n          this.pageDb.set(pagePath, finalResult)\n\n          return payload\n        }\n      )\n    })\n\n    inFlightPromise\n      .then(response => {\n        this.inFlightDb.delete(pagePath)\n      })\n      .catch(error => {\n        this.inFlightDb.delete(pagePath)\n        throw error\n      })\n\n    this.inFlightDb.set(pagePath, inFlightPromise)\n\n    return inFlightPromise\n  }\n\n  // returns undefined if loading page ran into errors\n  loadPageSync(rawPath) {\n    const pagePath = findPath(rawPath)\n    if (this.pageDb.has(pagePath)) {\n      const pageData = this.pageDb.get(pagePath).payload\n      return pageData\n    }\n    return undefined\n  }\n\n  shouldPrefetch(pagePath) {\n    // Skip prefetching if we know user is on slow or constrained connection\n    if (!doesConnectionSupportPrefetch()) {\n      return false\n    }\n\n    // Check if the page exists.\n    if (this.pageDb.has(pagePath)) {\n      return false\n    }\n\n    return true\n  }\n\n  prefetch(pagePath) {\n    if (!this.shouldPrefetch(pagePath)) {\n      return false\n    }\n\n    // Tell plugins with custom prefetching logic that they should start\n    // prefetching this path.\n    if (!this.prefetchTriggered.has(pagePath)) {\n      this.apiRunner(`onPrefetchPathname`, { pathname: pagePath })\n      this.prefetchTriggered.add(pagePath)\n    }\n\n    // If a plugin has disabled core prefetching, stop now.\n    if (this.prefetchDisabled) {\n      return false\n    }\n\n    const realPath = findPath(pagePath)\n    // Todo make doPrefetch logic cacheable\n    // eslint-disable-next-line consistent-return\n    this.doPrefetch(realPath).then(() => {\n      if (!this.prefetchCompleted.has(pagePath)) {\n        this.apiRunner(`onPostPrefetchPathname`, { pathname: pagePath })\n        this.prefetchCompleted.add(pagePath)\n      }\n    })\n\n    return true\n  }\n\n  doPrefetch(pagePath) {\n    throw new Error(`doPrefetch not implemented`)\n  }\n\n  hovering(rawPath) {\n    this.loadPage(rawPath)\n  }\n\n  getResourceURLsForPathname(rawPath) {\n    const pagePath = findPath(rawPath)\n    const page = this.pageDataDb.get(pagePath)\n    if (page) {\n      const pageResources = toPageResources(page.payload)\n\n      return [\n        ...createComponentUrls(pageResources.page.componentChunkName),\n        createPageDataUrl(pagePath),\n      ]\n    } else {\n      return null\n    }\n  }\n\n  isPageNotFound(rawPath) {\n    const pagePath = findPath(rawPath)\n    const page = this.pageDb.get(pagePath)\n    return page && page.notFound === true\n  }\n\n  loadAppData(retries = 0) {\n    return this.memoizedGet(`${__PATH_PREFIX__}/page-data/app-data.json`).then(\n      req => {\n        const { status, responseText } = req\n\n        let appData\n\n        if (status !== 200 && retries < 3) {\n          // Retry 3 times incase of non-200 responses\n          return this.loadAppData(retries + 1)\n        }\n\n        // Handle 200\n        if (status === 200) {\n          try {\n            const jsonPayload = JSON.parse(responseText)\n            if (jsonPayload.webpackCompilationHash === undefined) {\n              throw new Error(`not a valid app-data response`)\n            }\n\n            appData = jsonPayload\n          } catch (err) {\n            // continue regardless of error\n          }\n        }\n\n        return appData\n      }\n    )\n  }\n}\n\nconst createComponentUrls = componentChunkName =>\n  (window.___chunkMapping[componentChunkName] || []).map(\n    chunk => __PATH_PREFIX__ + chunk\n  )\n\nexport class ProdLoader extends BaseLoader {\n  constructor(asyncRequires, matchPaths) {\n    const loadComponent = chunkName =>\n      asyncRequires.components[chunkName]\n        ? asyncRequires.components[chunkName]()\n            .then(preferDefault)\n            // loader will handle the case when component is null\n            .catch(() => null)\n        : Promise.resolve()\n\n    super(loadComponent, matchPaths)\n  }\n\n  doPrefetch(pagePath) {\n    const pageDataUrl = createPageDataUrl(pagePath)\n    return prefetchHelper(pageDataUrl, {\n      crossOrigin: `anonymous`,\n      as: `fetch`,\n    })\n      .then(() =>\n        // This was just prefetched, so will return a response from\n        // the cache instead of making another request to the server\n        this.loadPageDataJson(pagePath)\n      )\n      .then(result => {\n        if (result.status !== PageResourceStatus.Success) {\n          return Promise.resolve()\n        }\n        const pageData = result.payload\n        const chunkName = pageData.componentChunkName\n        const componentUrls = createComponentUrls(chunkName)\n        return Promise.all(componentUrls.map(prefetchHelper)).then(\n          () => pageData\n        )\n      })\n  }\n\n  loadPageDataJson(rawPath) {\n    return super.loadPageDataJson(rawPath).then(data => {\n      if (data.notFound) {\n        // check if html file exist using HEAD request:\n        // if it does we should navigate to it instead of showing 404\n        return doFetch(rawPath, `HEAD`).then(req => {\n          if (req.status === 200) {\n            // page (.html file) actually exist (or we asked for 404 )\n            // returning page resources status as errored to trigger\n            // regular browser navigation to given page\n            return {\n              status: PageResourceStatus.Error,\n            }\n          }\n\n          // if HEAD request wasn't 200, return notFound result\n          // and show 404 page\n          return data\n        })\n      }\n      return data\n    })\n  }\n}\n\nlet instance\n\nexport const setLoader = _loader => {\n  instance = _loader\n}\n\nexport const publicLoader = {\n  // Deprecated methods. As far as we're aware, these are only used by\n  // core gatsby and the offline plugin, however there's a very small\n  // chance they're called by others.\n  getResourcesForPathname: rawPath => {\n    console.warn(\n      `Warning: getResourcesForPathname is deprecated. Use loadPage instead`\n    )\n    return instance.i.loadPage(rawPath)\n  },\n  getResourcesForPathnameSync: rawPath => {\n    console.warn(\n      `Warning: getResourcesForPathnameSync is deprecated. Use loadPageSync instead`\n    )\n    return instance.i.loadPageSync(rawPath)\n  },\n  enqueue: rawPath => instance.prefetch(rawPath),\n\n  // Real methods\n  getResourceURLsForPathname: rawPath =>\n    instance.getResourceURLsForPathname(rawPath),\n  loadPage: rawPath => instance.loadPage(rawPath),\n  loadPageSync: rawPath => instance.loadPageSync(rawPath),\n  prefetch: rawPath => instance.prefetch(rawPath),\n  isPageNotFound: rawPath => instance.isPageNotFound(rawPath),\n  hovering: rawPath => instance.hovering(rawPath),\n  loadAppData: () => instance.loadAppData(),\n}\n\nexport default publicLoader\n","\"use strict\";\n\nvar offsetY = 0;\n\nvar getTargetOffset = function getTargetOffset(hash) {\n  var id = window.decodeURI(hash.replace(\"#\", \"\"));\n\n  if (id !== \"\") {\n    var element = document.getElementById(id);\n\n    if (element) {\n      var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;\n      var clientTop = document.documentElement.clientTop || document.body.clientTop || 0;\n      var computedStyles = window.getComputedStyle(element);\n      var scrollMarginTop = computedStyles.getPropertyValue(\"scroll-margin-top\") || computedStyles.getPropertyValue(\"scroll-snap-margin-top\") || \"0px\";\n      return element.getBoundingClientRect().top + scrollTop - parseInt(scrollMarginTop, 10) - clientTop - offsetY;\n    }\n  }\n\n  return null;\n};\n\nexports.onInitialClientRender = function (_, pluginOptions) {\n  if (pluginOptions.offsetY) {\n    offsetY = pluginOptions.offsetY;\n  }\n\n  requestAnimationFrame(function () {\n    var offset = getTargetOffset(window.location.hash);\n\n    if (offset !== null) {\n      window.scrollTo(0, offset);\n    }\n  });\n};\n\nexports.shouldUpdateScroll = function (_ref) {\n  var location = _ref.routerProps.location;\n  var offset = getTargetOffset(location.hash);\n  return offset !== null ? [0, offset] : true;\n};","\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.ScrollContainer = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nvar _router = require(\"@reach/router\");\n\n// TODO: In Gatsby v3, this file should be removed.\n// We are deprecating this in V2 in favor of useScrollRestoration\nvar propTypes = {\n  scrollKey: _propTypes.default.string.isRequired,\n  shouldUpdateScroll: _propTypes.default.func,\n  children: _propTypes.default.element.isRequired\n};\nvar hasNotWarnedDeprecation = true;\n\nvar ScrollContainerImplementation = /*#__PURE__*/function (_React$Component) {\n  (0, _inheritsLoose2.default)(ScrollContainerImplementation, _React$Component);\n\n  function ScrollContainerImplementation(props) {\n    var _this;\n\n    _this = _React$Component.call(this, props) || this;\n\n    if (process.env.NODE_ENV !== \"production\" && hasNotWarnedDeprecation) {\n      hasNotWarnedDeprecation = false;\n      console.log(\"Deprecation Warning:\\n\\n  Gatsby <ScrollContainer> is deprecated in Gatsby v2 and will be removed in Gatsby v3.\\n  Update to the React hook alternative useScrollRestoration, like this:.\\n  \\n  ```\\n  import React from 'react';\\n  import { useScrollRestoration } from 'gatsby-react-router-scroll';\\n\\n  function Component() {\\n    const scrollRestoration = useScrollRestoration('\" + _this.props.scrollKey + \"');\\n\\n    return <ul {...scrollRestoration} />;\\n  }\\n  ```\\n  \");\n    }\n\n    return _this;\n  }\n\n  var _proto = ScrollContainerImplementation.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    var _this2 = this;\n\n    // eslint-disable-next-line react/no-find-dom-node\n    var node = _reactDom.default.findDOMNode(this);\n\n    var _this$props = this.props,\n        location = _this$props.location,\n        scrollKey = _this$props.scrollKey;\n    if (!node) return;\n    node.addEventListener(\"scroll\", function () {\n      _this2.props.context.save(location, scrollKey, node.scrollTop);\n    });\n    var position = this.props.context.read(location, scrollKey);\n    node.scrollTo(0, position || 0);\n  };\n\n  _proto.render = function render() {\n    return this.props.children;\n  };\n\n  return ScrollContainerImplementation;\n}(React.Component);\n\nvar ScrollContainer = function ScrollContainer(props) {\n  return /*#__PURE__*/React.createElement(_router.Location, null, function (_ref) {\n    var location = _ref.location;\n    return /*#__PURE__*/React.createElement(_scrollHandler.ScrollContext.Consumer, null, function (context) {\n      return /*#__PURE__*/React.createElement(ScrollContainerImplementation, (0, _extends2.default)({}, props, {\n        context: context,\n        location: location\n      }));\n    });\n  });\n};\n\nexports.ScrollContainer = ScrollContainer;\nScrollContainer.propTypes = propTypes;","const preferDefault = m => (m && m.default) || m\n\nif (process.env.BUILD_STAGE === `develop`) {\n  module.exports = preferDefault(require(`./public-page-renderer-dev`))\n} else if (process.env.BUILD_STAGE === `build-javascript`) {\n  module.exports = preferDefault(require(`./public-page-renderer-prod`))\n} else {\n  module.exports = () => null\n}\n","/*\n  Why commonjs and not ES imports/exports?\n\n  This module is used to alias `create-react-context` package, but drop the the actual implementation part\n  because Gatsby requires version of react that has implementatoin baked in.\n  \n  Package source is using ES modules:\n    - https://github.com/jamiebuilds/create-react-context/blob/v0.3.0/src/index.js\n  \n  But to build this package `babel-plugin-add-module-exports` is used ( https://www.npmjs.com/package/babel-plugin-add-module-exports).\n  Which result in both `module.exports` and `exports.default` being set to same thing.\n\n  We don't use that babel plugin so we only have `exports.default`.\n\n  This cause problems in various 3rd party react components that rely on `module.exports` being set.\n  See https://github.com/gatsbyjs/gatsby/issues/23645 for example of it.\n  \n  Instead of adding same babel plugin we mimic output here. Adding babel plugin just for this would:\n   a) unnecesairly slow down compilation for all other files (if we just apply it everywhere)\n   b) or complicate babel-loader configuration with overwrite specifically for this file\n*/\n\nconst { createContext } = require(`react`)\n\nmodule.exports = createContext\nmodule.exports.default = createContext\n","function _extends() {\n  module.exports = _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","import React from \"react\"\nimport PropTypes from \"prop-types\"\n\nimport InternalPageRenderer from \"./page-renderer\"\n\nconst ProdPageRenderer = ({ location, pageResources }) => {\n  if (!pageResources) {\n    return null\n  }\n  return React.createElement(InternalPageRenderer, {\n    location,\n    pageResources,\n    ...pageResources.json,\n  })\n}\n\nProdPageRenderer.propTypes = {\n  location: PropTypes.shape({\n    pathname: PropTypes.string.isRequired,\n  }).isRequired,\n}\n\nexport default ProdPageRenderer\n","const plugins = require(`./api-runner-browser-plugins`)\nconst {\n  getResourcesForPathname,\n  getResourcesForPathnameSync,\n  getResourceURLsForPathname,\n  loadPage,\n  loadPageSync,\n} = require(`./loader`).publicLoader\n\nexports.apiRunner = (api, args = {}, defaultReturn, argTransform) => {\n  // Hooks for gatsby-cypress's API handler\n  if (process.env.CYPRESS_SUPPORT) {\n    if (window.___apiHandler) {\n      window.___apiHandler(api)\n    } else if (window.___resolvedAPIs) {\n      window.___resolvedAPIs.push(api)\n    } else {\n      window.___resolvedAPIs = [api]\n    }\n  }\n\n  let results = plugins.map(plugin => {\n    if (!plugin.plugin[api]) {\n      return undefined\n    }\n\n    // Deprecated April 2019. Use `loadPageSync` instead\n    args.getResourcesForPathnameSync = getResourcesForPathnameSync\n    // Deprecated April 2019. Use `loadPage` instead\n    args.getResourcesForPathname = getResourcesForPathname\n    args.getResourceURLsForPathname = getResourceURLsForPathname\n    args.loadPage = loadPage\n    args.loadPageSync = loadPageSync\n\n    const result = plugin.plugin[api](args, plugin.options)\n    if (result && argTransform) {\n      args = argTransform({ args, result, plugin })\n    }\n    return result\n  })\n\n  // Filter out undefined results.\n  results = results.filter(result => typeof result !== `undefined`)\n\n  if (results.length > 0) {\n    return results\n  } else if (defaultReturn) {\n    return [defaultReturn]\n  } else {\n    return []\n  }\n}\n\nexports.apiRunnerAsync = (api, args, defaultReturn) =>\n  plugins.reduce(\n    (previous, next) =>\n      next.plugin[api]\n        ? previous.then(() => next.plugin[api](args, next.options))\n        : previous,\n    Promise.resolve()\n  )\n"],"sourceRoot":""}