{"version":3,"sources":["node_modules/@angular/common/fesm2022/http.mjs","node_modules/@angular/platform-browser/fesm2022/platform-browser.mjs"],"sourcesContent":["/**\n * @license Angular v19.1.3\n * (c) 2010-2024 Google LLC. https://angular.io/\n * License: MIT\n */\n\nimport * as i0 from '@angular/core';\nimport { ɵRuntimeError, Injectable, InjectionToken, inject, NgZone, runInInjectionContext, ɵPendingTasksInternal, PLATFORM_ID, ɵConsole, ɵformatRuntimeError, Inject, makeEnvironmentProviders, NgModule, TransferState, makeStateKey, ɵperformanceMarkFeature, APP_BOOTSTRAP_LISTENER, ApplicationRef, ɵtruncateMiddle } from '@angular/core';\nimport { of, Observable, from } from 'rxjs';\nimport { concatMap, filter, map, finalize, switchMap, tap } from 'rxjs/operators';\nimport * as i1 from '@angular/common';\nimport { isPlatformServer, DOCUMENT, ɵparseCookieValue } from '@angular/common';\n\n/**\n * Transforms an `HttpRequest` into a stream of `HttpEvent`s, one of which will likely be a\n * `HttpResponse`.\n *\n * `HttpHandler` is injectable. When injected, the handler instance dispatches requests to the\n * first interceptor in the chain, which dispatches to the second, etc, eventually reaching the\n * `HttpBackend`.\n *\n * In an `HttpInterceptor`, the `HttpHandler` parameter is the next interceptor in the chain.\n *\n * @publicApi\n */\nclass HttpHandler {}\n/**\n * A final `HttpHandler` which will dispatch the request via browser HTTP APIs to a backend.\n *\n * Interceptors sit between the `HttpClient` interface and the `HttpBackend`.\n *\n * When injected, `HttpBackend` dispatches requests directly to the backend, without going\n * through the interceptor chain.\n *\n * @publicApi\n */\nclass HttpBackend {}\n\n/**\n * Represents the header configuration options for an HTTP request.\n * Instances are immutable. Modifying methods return a cloned\n * instance with the change. The original object is never changed.\n *\n * @publicApi\n */\nclass HttpHeaders {\n  /**\n   * Internal map of lowercase header names to values.\n   */\n  // TODO(issue/24571): remove '!'.\n  headers;\n  /**\n   * Internal map of lowercased header names to the normalized\n   * form of the name (the form seen first).\n   */\n  normalizedNames = /*#__PURE__*/new Map();\n  /**\n   * Complete the lazy initialization of this object (needed before reading).\n   */\n  lazyInit;\n  /**\n   * Queued updates to be materialized the next initialization.\n   */\n  lazyUpdate = null;\n  /**  Constructs a new HTTP header object with the given values.*/\n  constructor(headers) {\n    if (!headers) {\n      this.headers = new Map();\n    } else if (typeof headers === 'string') {\n      this.lazyInit = () => {\n        this.headers = new Map();\n        headers.split('\\n').forEach(line => {\n          const index = line.indexOf(':');\n          if (index > 0) {\n            const name = line.slice(0, index);\n            const value = line.slice(index + 1).trim();\n            this.addHeaderEntry(name, value);\n          }\n        });\n      };\n    } else if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n      this.headers = new Map();\n      headers.forEach((value, name) => {\n        this.addHeaderEntry(name, value);\n      });\n    } else {\n      this.lazyInit = () => {\n        if (typeof ngDevMode === 'undefined' || ngDevMode) {\n          assertValidHeaders(headers);\n        }\n        this.headers = new Map();\n        Object.entries(headers).forEach(([name, values]) => {\n          this.setHeaderEntries(name, values);\n        });\n      };\n    }\n  }\n  /**\n   * Checks for existence of a given header.\n   *\n   * @param name The header name to check for existence.\n   *\n   * @returns True if the header exists, false otherwise.\n   */\n  has(name) {\n    this.init();\n    return this.headers.has(name.toLowerCase());\n  }\n  /**\n   * Retrieves the first value of a given header.\n   *\n   * @param name The header name.\n   *\n   * @returns The value string if the header exists, null otherwise\n   */\n  get(name) {\n    this.init();\n    const values = this.headers.get(name.toLowerCase());\n    return values && values.length > 0 ? values[0] : null;\n  }\n  /**\n   * Retrieves the names of the headers.\n   *\n   * @returns A list of header names.\n   */\n  keys() {\n    this.init();\n    return Array.from(this.normalizedNames.values());\n  }\n  /**\n   * Retrieves a list of values for a given header.\n   *\n   * @param name The header name from which to retrieve values.\n   *\n   * @returns A string of values if the header exists, null otherwise.\n   */\n  getAll(name) {\n    this.init();\n    return this.headers.get(name.toLowerCase()) || null;\n  }\n  /**\n   * Appends a new value to the existing set of values for a header\n   * and returns them in a clone of the original instance.\n   *\n   * @param name The header name for which to append the values.\n   * @param value The value to append.\n   *\n   * @returns A clone of the HTTP headers object with the value appended to the given header.\n   */\n  append(name, value) {\n    return this.clone({\n      name,\n      value,\n      op: 'a'\n    });\n  }\n  /**\n   * Sets or modifies a value for a given header in a clone of the original instance.\n   * If the header already exists, its value is replaced with the given value\n   * in the returned object.\n   *\n   * @param name The header name.\n   * @param value The value or values to set or override for the given header.\n   *\n   * @returns A clone of the HTTP headers object with the newly set header value.\n   */\n  set(name, value) {\n    return this.clone({\n      name,\n      value,\n      op: 's'\n    });\n  }\n  /**\n   * Deletes values for a given header in a clone of the original instance.\n   *\n   * @param name The header name.\n   * @param value The value or values to delete for the given header.\n   *\n   * @returns A clone of the HTTP headers object with the given value deleted.\n   */\n  delete(name, value) {\n    return this.clone({\n      name,\n      value,\n      op: 'd'\n    });\n  }\n  maybeSetNormalizedName(name, lcName) {\n    if (!this.normalizedNames.has(lcName)) {\n      this.normalizedNames.set(lcName, name);\n    }\n  }\n  init() {\n    if (!!this.lazyInit) {\n      if (this.lazyInit instanceof HttpHeaders) {\n        this.copyFrom(this.lazyInit);\n      } else {\n        this.lazyInit();\n      }\n      this.lazyInit = null;\n      if (!!this.lazyUpdate) {\n        this.lazyUpdate.forEach(update => this.applyUpdate(update));\n        this.lazyUpdate = null;\n      }\n    }\n  }\n  copyFrom(other) {\n    other.init();\n    Array.from(other.headers.keys()).forEach(key => {\n      this.headers.set(key, other.headers.get(key));\n      this.normalizedNames.set(key, other.normalizedNames.get(key));\n    });\n  }\n  clone(update) {\n    const clone = new HttpHeaders();\n    clone.lazyInit = !!this.lazyInit && this.lazyInit instanceof HttpHeaders ? this.lazyInit : this;\n    clone.lazyUpdate = (this.lazyUpdate || []).concat([update]);\n    return clone;\n  }\n  applyUpdate(update) {\n    const key = update.name.toLowerCase();\n    switch (update.op) {\n      case 'a':\n      case 's':\n        let value = update.value;\n        if (typeof value === 'string') {\n          value = [value];\n        }\n        if (value.length === 0) {\n          return;\n        }\n        this.maybeSetNormalizedName(update.name, key);\n        const base = (update.op === 'a' ? this.headers.get(key) : undefined) || [];\n        base.push(...value);\n        this.headers.set(key, base);\n        break;\n      case 'd':\n        const toDelete = update.value;\n        if (!toDelete) {\n          this.headers.delete(key);\n          this.normalizedNames.delete(key);\n        } else {\n          let existing = this.headers.get(key);\n          if (!existing) {\n            return;\n          }\n          existing = existing.filter(value => toDelete.indexOf(value) === -1);\n          if (existing.length === 0) {\n            this.headers.delete(key);\n            this.normalizedNames.delete(key);\n          } else {\n            this.headers.set(key, existing);\n          }\n        }\n        break;\n    }\n  }\n  addHeaderEntry(name, value) {\n    const key = name.toLowerCase();\n    this.maybeSetNormalizedName(name, key);\n    if (this.headers.has(key)) {\n      this.headers.get(key).push(value);\n    } else {\n      this.headers.set(key, [value]);\n    }\n  }\n  setHeaderEntries(name, values) {\n    const headerValues = (Array.isArray(values) ? values : [values]).map(value => value.toString());\n    const key = name.toLowerCase();\n    this.headers.set(key, headerValues);\n    this.maybeSetNormalizedName(name, key);\n  }\n  /**\n   * @internal\n   */\n  forEach(fn) {\n    this.init();\n    Array.from(this.normalizedNames.keys()).forEach(key => fn(this.normalizedNames.get(key), this.headers.get(key)));\n  }\n}\n/**\n * Verifies that the headers object has the right shape: the values\n * must be either strings, numbers or arrays. Throws an error if an invalid\n * header value is present.\n */\nfunction assertValidHeaders(headers) {\n  for (const [key, value] of Object.entries(headers)) {\n    if (!(typeof value === 'string' || typeof value === 'number') && !Array.isArray(value)) {\n      throw new Error(`Unexpected value of the \\`${key}\\` header provided. ` + `Expecting either a string, a number or an array, but got: \\`${value}\\`.`);\n    }\n  }\n}\n\n/**\n * Provides encoding and decoding of URL parameter and query-string values.\n *\n * Serializes and parses URL parameter keys and values to encode and decode them.\n * If you pass URL query parameters without encoding,\n * the query parameters can be misinterpreted at the receiving end.\n *\n *\n * @publicApi\n */\nclass HttpUrlEncodingCodec {\n  /**\n   * Encodes a key name for a URL parameter or query-string.\n   * @param key The key name.\n   * @returns The encoded key name.\n   */\n  encodeKey(key) {\n    return standardEncoding(key);\n  }\n  /**\n   * Encodes the value of a URL parameter or query-string.\n   * @param value The value.\n   * @returns The encoded value.\n   */\n  encodeValue(value) {\n    return standardEncoding(value);\n  }\n  /**\n   * Decodes an encoded URL parameter or query-string key.\n   * @param key The encoded key name.\n   * @returns The decoded key name.\n   */\n  decodeKey(key) {\n    return decodeURIComponent(key);\n  }\n  /**\n   * Decodes an encoded URL parameter or query-string value.\n   * @param value The encoded value.\n   * @returns The decoded value.\n   */\n  decodeValue(value) {\n    return decodeURIComponent(value);\n  }\n}\nfunction paramParser(rawParams, codec) {\n  const map = new Map();\n  if (rawParams.length > 0) {\n    // The `window.location.search` can be used while creating an instance of the `HttpParams` class\n    // (e.g. `new HttpParams({ fromString: window.location.search })`). The `window.location.search`\n    // may start with the `?` char, so we strip it if it's present.\n    const params = rawParams.replace(/^\\?/, '').split('&');\n    params.forEach(param => {\n      const eqIdx = param.indexOf('=');\n      const [key, val] = eqIdx == -1 ? [codec.decodeKey(param), ''] : [codec.decodeKey(param.slice(0, eqIdx)), codec.decodeValue(param.slice(eqIdx + 1))];\n      const list = map.get(key) || [];\n      list.push(val);\n      map.set(key, list);\n    });\n  }\n  return map;\n}\n/**\n * Encode input string with standard encodeURIComponent and then un-encode specific characters.\n */\nconst STANDARD_ENCODING_REGEX = /%(\\d[a-f0-9])/gi;\nconst STANDARD_ENCODING_REPLACEMENTS = {\n  '40': '@',\n  '3A': ':',\n  '24': '$',\n  '2C': ',',\n  '3B': ';',\n  '3D': '=',\n  '3F': '?',\n  '2F': '/'\n};\nfunction standardEncoding(v) {\n  return encodeURIComponent(v).replace(STANDARD_ENCODING_REGEX, (s, t) => STANDARD_ENCODING_REPLACEMENTS[t] ?? s);\n}\nfunction valueToString(value) {\n  return `${value}`;\n}\n/**\n * An HTTP request/response body that represents serialized parameters,\n * per the MIME type `application/x-www-form-urlencoded`.\n *\n * This class is immutable; all mutation operations return a new instance.\n *\n * @publicApi\n */\nclass HttpParams {\n  map;\n  encoder;\n  updates = null;\n  cloneFrom = null;\n  constructor(options = {}) {\n    this.encoder = options.encoder || new HttpUrlEncodingCodec();\n    if (options.fromString) {\n      if (options.fromObject) {\n        throw new ɵRuntimeError(2805 /* RuntimeErrorCode.CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT */, ngDevMode && 'Cannot specify both fromString and fromObject.');\n      }\n      this.map = paramParser(options.fromString, this.encoder);\n    } else if (!!options.fromObject) {\n      this.map = new Map();\n      Object.keys(options.fromObject).forEach(key => {\n        const value = options.fromObject[key];\n        // convert the values to strings\n        const values = Array.isArray(value) ? value.map(valueToString) : [valueToString(value)];\n        this.map.set(key, values);\n      });\n    } else {\n      this.map = null;\n    }\n  }\n  /**\n   * Reports whether the body includes one or more values for a given parameter.\n   * @param param The parameter name.\n   * @returns True if the parameter has one or more values,\n   * false if it has no value or is not present.\n   */\n  has(param) {\n    this.init();\n    return this.map.has(param);\n  }\n  /**\n   * Retrieves the first value for a parameter.\n   * @param param The parameter name.\n   * @returns The first value of the given parameter,\n   * or `null` if the parameter is not present.\n   */\n  get(param) {\n    this.init();\n    const res = this.map.get(param);\n    return !!res ? res[0] : null;\n  }\n  /**\n   * Retrieves all values for a  parameter.\n   * @param param The parameter name.\n   * @returns All values in a string array,\n   * or `null` if the parameter not present.\n   */\n  getAll(param) {\n    this.init();\n    return this.map.get(param) || null;\n  }\n  /**\n   * Retrieves all the parameters for this body.\n   * @returns The parameter names in a string array.\n   */\n  keys() {\n    this.init();\n    return Array.from(this.map.keys());\n  }\n  /**\n   * Appends a new value to existing values for a parameter.\n   * @param param The parameter name.\n   * @param value The new value to add.\n   * @return A new body with the appended value.\n   */\n  append(param, value) {\n    return this.clone({\n      param,\n      value,\n      op: 'a'\n    });\n  }\n  /**\n   * Constructs a new body with appended values for the given parameter name.\n   * @param params parameters and values\n   * @return A new body with the new value.\n   */\n  appendAll(params) {\n    const updates = [];\n    Object.keys(params).forEach(param => {\n      const value = params[param];\n      if (Array.isArray(value)) {\n        value.forEach(_value => {\n          updates.push({\n            param,\n            value: _value,\n            op: 'a'\n          });\n        });\n      } else {\n        updates.push({\n          param,\n          value: value,\n          op: 'a'\n        });\n      }\n    });\n    return this.clone(updates);\n  }\n  /**\n   * Replaces the value for a parameter.\n   * @param param The parameter name.\n   * @param value The new value.\n   * @return A new body with the new value.\n   */\n  set(param, value) {\n    return this.clone({\n      param,\n      value,\n      op: 's'\n    });\n  }\n  /**\n   * Removes a given value or all values from a parameter.\n   * @param param The parameter name.\n   * @param value The value to remove, if provided.\n   * @return A new body with the given value removed, or with all values\n   * removed if no value is specified.\n   */\n  delete(param, value) {\n    return this.clone({\n      param,\n      value,\n      op: 'd'\n    });\n  }\n  /**\n   * Serializes the body to an encoded string, where key-value pairs (separated by `=`) are\n   * separated by `&`s.\n   */\n  toString() {\n    this.init();\n    return this.keys().map(key => {\n      const eKey = this.encoder.encodeKey(key);\n      // `a: ['1']` produces `'a=1'`\n      // `b: []` produces `''`\n      // `c: ['1', '2']` produces `'c=1&c=2'`\n      return this.map.get(key).map(value => eKey + '=' + this.encoder.encodeValue(value)).join('&');\n    })\n    // filter out empty values because `b: []` produces `''`\n    // which results in `a=1&&c=1&c=2` instead of `a=1&c=1&c=2` if we don't\n    .filter(param => param !== '').join('&');\n  }\n  clone(update) {\n    const clone = new HttpParams({\n      encoder: this.encoder\n    });\n    clone.cloneFrom = this.cloneFrom || this;\n    clone.updates = (this.updates || []).concat(update);\n    return clone;\n  }\n  init() {\n    if (this.map === null) {\n      this.map = new Map();\n    }\n    if (this.cloneFrom !== null) {\n      this.cloneFrom.init();\n      this.cloneFrom.keys().forEach(key => this.map.set(key, this.cloneFrom.map.get(key)));\n      this.updates.forEach(update => {\n        switch (update.op) {\n          case 'a':\n          case 's':\n            const base = (update.op === 'a' ? this.map.get(update.param) : undefined) || [];\n            base.push(valueToString(update.value));\n            this.map.set(update.param, base);\n            break;\n          case 'd':\n            if (update.value !== undefined) {\n              let base = this.map.get(update.param) || [];\n              const idx = base.indexOf(valueToString(update.value));\n              if (idx !== -1) {\n                base.splice(idx, 1);\n              }\n              if (base.length > 0) {\n                this.map.set(update.param, base);\n              } else {\n                this.map.delete(update.param);\n              }\n            } else {\n              this.map.delete(update.param);\n              break;\n            }\n        }\n      });\n      this.cloneFrom = this.updates = null;\n    }\n  }\n}\n\n/**\n * A token used to manipulate and access values stored in `HttpContext`.\n *\n * @publicApi\n */\nclass HttpContextToken {\n  defaultValue;\n  constructor(defaultValue) {\n    this.defaultValue = defaultValue;\n  }\n}\n/**\n * Http context stores arbitrary user defined values and ensures type safety without\n * actually knowing the types. It is backed by a `Map` and guarantees that keys do not clash.\n *\n * This context is mutable and is shared between cloned requests unless explicitly specified.\n *\n * @usageNotes\n *\n * ### Usage Example\n *\n * ```ts\n * // inside cache.interceptors.ts\n * export const IS_CACHE_ENABLED = new HttpContextToken<boolean>(() => false);\n *\n * export class CacheInterceptor implements HttpInterceptor {\n *\n *   intercept(req: HttpRequest<any>, delegate: HttpHandler): Observable<HttpEvent<any>> {\n *     if (req.context.get(IS_CACHE_ENABLED) === true) {\n *       return ...;\n *     }\n *     return delegate.handle(req);\n *   }\n * }\n *\n * // inside a service\n *\n * this.httpClient.get('/api/weather', {\n *   context: new HttpContext().set(IS_CACHE_ENABLED, true)\n * }).subscribe(...);\n * ```\n *\n * @publicApi\n */\nclass HttpContext {\n  map = /*#__PURE__*/new Map();\n  /**\n   * Store a value in the context. If a value is already present it will be overwritten.\n   *\n   * @param token The reference to an instance of `HttpContextToken`.\n   * @param value The value to store.\n   *\n   * @returns A reference to itself for easy chaining.\n   */\n  set(token, value) {\n    this.map.set(token, value);\n    return this;\n  }\n  /**\n   * Retrieve the value associated with the given token.\n   *\n   * @param token The reference to an instance of `HttpContextToken`.\n   *\n   * @returns The stored value or default if one is defined.\n   */\n  get(token) {\n    if (!this.map.has(token)) {\n      this.map.set(token, token.defaultValue());\n    }\n    return this.map.get(token);\n  }\n  /**\n   * Delete the value associated with the given token.\n   *\n   * @param token The reference to an instance of `HttpContextToken`.\n   *\n   * @returns A reference to itself for easy chaining.\n   */\n  delete(token) {\n    this.map.delete(token);\n    return this;\n  }\n  /**\n   * Checks for existence of a given token.\n   *\n   * @param token The reference to an instance of `HttpContextToken`.\n   *\n   * @returns True if the token exists, false otherwise.\n   */\n  has(token) {\n    return this.map.has(token);\n  }\n  /**\n   * @returns a list of tokens currently stored in the context.\n   */\n  keys() {\n    return this.map.keys();\n  }\n}\n\n/**\n * Determine whether the given HTTP method may include a body.\n */\nfunction mightHaveBody(method) {\n  switch (method) {\n    case 'DELETE':\n    case 'GET':\n    case 'HEAD':\n    case 'OPTIONS':\n    case 'JSONP':\n      return false;\n    default:\n      return true;\n  }\n}\n/**\n * Safely assert whether the given value is an ArrayBuffer.\n *\n * In some execution environments ArrayBuffer is not defined.\n */\nfunction isArrayBuffer(value) {\n  return typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer;\n}\n/**\n * Safely assert whether the given value is a Blob.\n *\n * In some execution environments Blob is not defined.\n */\nfunction isBlob(value) {\n  return typeof Blob !== 'undefined' && value instanceof Blob;\n}\n/**\n * Safely assert whether the given value is a FormData instance.\n *\n * In some execution environments FormData is not defined.\n */\nfunction isFormData(value) {\n  return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n/**\n * Safely assert whether the given value is a URLSearchParams instance.\n *\n * In some execution environments URLSearchParams is not defined.\n */\nfunction isUrlSearchParams(value) {\n  return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams;\n}\n/**\n * `Content-Type` is an HTTP header used to indicate the media type\n * (also known as MIME type) of the resource being sent to the client\n * or received from the server.\n */\nconst CONTENT_TYPE_HEADER = 'Content-Type';\n/**\n * `X-Request-URL` is a custom HTTP header used in older browser versions,\n * including Firefox (< 32), Chrome (< 37), Safari (< 8), and Internet Explorer,\n * to include the full URL of the request in cross-origin requests.\n */\nconst X_REQUEST_URL_HEADER = 'X-Request-URL';\n/**\n * `text/plain` is a content type used to indicate that the content being\n * sent is plain text with no special formatting or structured data\n * like HTML, XML, or JSON.\n */\nconst TEXT_CONTENT_TYPE = 'text/plain';\n/**\n * `application/json` is a content type used to indicate that the content\n * being sent is in the JSON format.\n */\nconst JSON_CONTENT_TYPE = 'application/json';\n/**\n * `application/json, text/plain, *\\/*` is a content negotiation string often seen in the\n * Accept header of HTTP requests. It indicates the types of content the client is willing\n * to accept from the server, with a preference for `application/json` and `text/plain`,\n * but also accepting any other type (*\\/*).\n */\nconst ACCEPT_HEADER = `${JSON_CONTENT_TYPE}, ${TEXT_CONTENT_TYPE}, */*`;\n/**\n * An outgoing HTTP request with an optional typed body.\n *\n * `HttpRequest` represents an outgoing request, including URL, method,\n * headers, body, and other request configuration options. Instances should be\n * assumed to be immutable. To modify a `HttpRequest`, the `clone`\n * method should be used.\n *\n * @publicApi\n */\nclass HttpRequest {\n  url;\n  /**\n   * The request body, or `null` if one isn't set.\n   *\n   * Bodies are not enforced to be immutable, as they can include a reference to any\n   * user-defined data type. However, interceptors should take care to preserve\n   * idempotence by treating them as such.\n   */\n  body = null;\n  /**\n   * Outgoing headers for this request.\n   */\n  // TODO(issue/24571): remove '!'.\n  headers;\n  /**\n   * Shared and mutable context that can be used by interceptors\n   */\n  context;\n  /**\n   * Whether this request should be made in a way that exposes progress events.\n   *\n   * Progress events are expensive (change detection runs on each event) and so\n   * they should only be requested if the consumer intends to monitor them.\n   *\n   * Note: The `FetchBackend` doesn't support progress report on uploads.\n   */\n  reportProgress = false;\n  /**\n   * Whether this request should be sent with outgoing credentials (cookies).\n   */\n  withCredentials = false;\n  /**\n   * The expected response type of the server.\n   *\n   * This is used to parse the response appropriately before returning it to\n   * the requestee.\n   */\n  responseType = 'json';\n  /**\n   * The outgoing HTTP request method.\n   */\n  method;\n  /**\n   * Outgoing URL parameters.\n   *\n   * To pass a string representation of HTTP parameters in the URL-query-string format,\n   * the `HttpParamsOptions`' `fromString` may be used. For example:\n   *\n   * ```ts\n   * new HttpParams({fromString: 'angular=awesome'})\n   * ```\n   */\n  // TODO(issue/24571): remove '!'.\n  params;\n  /**\n   * The outgoing URL with all URL parameters set.\n   */\n  urlWithParams;\n  /**\n   * The HttpTransferCache option for the request\n   */\n  transferCache;\n  constructor(method, url, third, fourth) {\n    this.url = url;\n    this.method = method.toUpperCase();\n    // Next, need to figure out which argument holds the HttpRequestInit\n    // options, if any.\n    let options;\n    // Check whether a body argument is expected. The only valid way to omit\n    // the body argument is to use a known no-body method like GET.\n    if (mightHaveBody(this.method) || !!fourth) {\n      // Body is the third argument, options are the fourth.\n      this.body = third !== undefined ? third : null;\n      options = fourth;\n    } else {\n      // No body required, options are the third argument. The body stays null.\n      options = third;\n    }\n    // If options have been passed, interpret them.\n    if (options) {\n      // Normalize reportProgress and withCredentials.\n      this.reportProgress = !!options.reportProgress;\n      this.withCredentials = !!options.withCredentials;\n      // Override default response type of 'json' if one is provided.\n      if (!!options.responseType) {\n        this.responseType = options.responseType;\n      }\n      // Override headers if they're provided.\n      if (!!options.headers) {\n        this.headers = options.headers;\n      }\n      if (!!options.context) {\n        this.context = options.context;\n      }\n      if (!!options.params) {\n        this.params = options.params;\n      }\n      // We do want to assign transferCache even if it's falsy (false is valid value)\n      this.transferCache = options.transferCache;\n    }\n    // If no headers have been passed in, construct a new HttpHeaders instance.\n    this.headers ??= new HttpHeaders();\n    // If no context have been passed in, construct a new HttpContext instance.\n    this.context ??= new HttpContext();\n    // If no parameters have been passed in, construct a new HttpUrlEncodedParams instance.\n    if (!this.params) {\n      this.params = new HttpParams();\n      this.urlWithParams = url;\n    } else {\n      // Encode the parameters to a string in preparation for inclusion in the URL.\n      const params = this.params.toString();\n      if (params.length === 0) {\n        // No parameters, the visible URL is just the URL given at creation time.\n        this.urlWithParams = url;\n      } else {\n        // Does the URL already have query parameters? Look for '?'.\n        const qIdx = url.indexOf('?');\n        // There are 3 cases to handle:\n        // 1) No existing parameters -> append '?' followed by params.\n        // 2) '?' exists and is followed by existing query string ->\n        //    append '&' followed by params.\n        // 3) '?' exists at the end of the url -> append params directly.\n        // This basically amounts to determining the character, if any, with\n        // which to join the URL and parameters.\n        const sep = qIdx === -1 ? '?' : qIdx < url.length - 1 ? '&' : '';\n        this.urlWithParams = url + sep + params;\n      }\n    }\n  }\n  /**\n   * Transform the free-form body into a serialized format suitable for\n   * transmission to the server.\n   */\n  serializeBody() {\n    // If no body is present, no need to serialize it.\n    if (this.body === null) {\n      return null;\n    }\n    // Check whether the body is already in a serialized form. If so,\n    // it can just be returned directly.\n    if (typeof this.body === 'string' || isArrayBuffer(this.body) || isBlob(this.body) || isFormData(this.body) || isUrlSearchParams(this.body)) {\n      return this.body;\n    }\n    // Check whether the body is an instance of HttpUrlEncodedParams.\n    if (this.body instanceof HttpParams) {\n      return this.body.toString();\n    }\n    // Check whether the body is an object or array, and serialize with JSON if so.\n    if (typeof this.body === 'object' || typeof this.body === 'boolean' || Array.isArray(this.body)) {\n      return JSON.stringify(this.body);\n    }\n    // Fall back on toString() for everything else.\n    return this.body.toString();\n  }\n  /**\n   * Examine the body and attempt to infer an appropriate MIME type\n   * for it.\n   *\n   * If no such type can be inferred, this method will return `null`.\n   */\n  detectContentTypeHeader() {\n    // An empty body has no content type.\n    if (this.body === null) {\n      return null;\n    }\n    // FormData bodies rely on the browser's content type assignment.\n    if (isFormData(this.body)) {\n      return null;\n    }\n    // Blobs usually have their own content type. If it doesn't, then\n    // no type can be inferred.\n    if (isBlob(this.body)) {\n      return this.body.type || null;\n    }\n    // Array buffers have unknown contents and thus no type can be inferred.\n    if (isArrayBuffer(this.body)) {\n      return null;\n    }\n    // Technically, strings could be a form of JSON data, but it's safe enough\n    // to assume they're plain strings.\n    if (typeof this.body === 'string') {\n      return TEXT_CONTENT_TYPE;\n    }\n    // `HttpUrlEncodedParams` has its own content-type.\n    if (this.body instanceof HttpParams) {\n      return 'application/x-www-form-urlencoded;charset=UTF-8';\n    }\n    // Arrays, objects, boolean and numbers will be encoded as JSON.\n    if (typeof this.body === 'object' || typeof this.body === 'number' || typeof this.body === 'boolean') {\n      return JSON_CONTENT_TYPE;\n    }\n    // No type could be inferred.\n    return null;\n  }\n  clone(update = {}) {\n    // For method, url, and responseType, take the current value unless\n    // it is overridden in the update hash.\n    const method = update.method || this.method;\n    const url = update.url || this.url;\n    const responseType = update.responseType || this.responseType;\n    // Carefully handle the transferCache to differentiate between\n    // `false` and `undefined` in the update args.\n    const transferCache = update.transferCache ?? this.transferCache;\n    // The body is somewhat special - a `null` value in update.body means\n    // whatever current body is present is being overridden with an empty\n    // body, whereas an `undefined` value in update.body implies no\n    // override.\n    const body = update.body !== undefined ? update.body : this.body;\n    // Carefully handle the boolean options to differentiate between\n    // `false` and `undefined` in the update args.\n    const withCredentials = update.withCredentials ?? this.withCredentials;\n    const reportProgress = update.reportProgress ?? this.reportProgress;\n    // Headers and params may be appended to if `setHeaders` or\n    // `setParams` are used.\n    let headers = update.headers || this.headers;\n    let params = update.params || this.params;\n    // Pass on context if needed\n    const context = update.context ?? this.context;\n    // Check whether the caller has asked to add headers.\n    if (update.setHeaders !== undefined) {\n      // Set every requested header.\n      headers = Object.keys(update.setHeaders).reduce((headers, name) => headers.set(name, update.setHeaders[name]), headers);\n    }\n    // Check whether the caller has asked to set params.\n    if (update.setParams) {\n      // Set every requested param.\n      params = Object.keys(update.setParams).reduce((params, param) => params.set(param, update.setParams[param]), params);\n    }\n    // Finally, construct the new HttpRequest using the pieces from above.\n    return new HttpRequest(method, url, body, {\n      params,\n      headers,\n      context,\n      reportProgress,\n      responseType,\n      withCredentials,\n      transferCache\n    });\n  }\n}\n\n/**\n * Type enumeration for the different kinds of `HttpEvent`.\n *\n * @publicApi\n */\nvar HttpEventType = /*#__PURE__*/function (HttpEventType) {\n  /**\n   * The request was sent out over the wire.\n   */\n  HttpEventType[HttpEventType[\"Sent\"] = 0] = \"Sent\";\n  /**\n   * An upload progress event was received.\n   *\n   * Note: The `FetchBackend` doesn't support progress report on uploads.\n   */\n  HttpEventType[HttpEventType[\"UploadProgress\"] = 1] = \"UploadProgress\";\n  /**\n   * The response status code and headers were received.\n   */\n  HttpEventType[HttpEventType[\"ResponseHeader\"] = 2] = \"ResponseHeader\";\n  /**\n   * A download progress event was received.\n   */\n  HttpEventType[HttpEventType[\"DownloadProgress\"] = 3] = \"DownloadProgress\";\n  /**\n   * The full response including the body was received.\n   */\n  HttpEventType[HttpEventType[\"Response\"] = 4] = \"Response\";\n  /**\n   * A custom event from an interceptor or a backend.\n   */\n  HttpEventType[HttpEventType[\"User\"] = 5] = \"User\";\n  return HttpEventType;\n}(HttpEventType || {});\n/**\n * Base class for both `HttpResponse` and `HttpHeaderResponse`.\n *\n * @publicApi\n */\nclass HttpResponseBase {\n  /**\n   * All response headers.\n   */\n  headers;\n  /**\n   * Response status code.\n   */\n  status;\n  /**\n   * Textual description of response status code, defaults to OK.\n   *\n   * Do not depend on this.\n   */\n  statusText;\n  /**\n   * URL of the resource retrieved, or null if not available.\n   */\n  url;\n  /**\n   * Whether the status code falls in the 2xx range.\n   */\n  ok;\n  /**\n   * Type of the response, narrowed to either the full response or the header.\n   */\n  // TODO(issue/24571): remove '!'.\n  type;\n  /**\n   * Super-constructor for all responses.\n   *\n   * The single parameter accepted is an initialization hash. Any properties\n   * of the response passed there will override the default values.\n   */\n  constructor(init, defaultStatus = 200, defaultStatusText = 'OK') {\n    // If the hash has values passed, use them to initialize the response.\n    // Otherwise use the default values.\n    this.headers = init.headers || new HttpHeaders();\n    this.status = init.status !== undefined ? init.status : defaultStatus;\n    this.statusText = init.statusText || defaultStatusText;\n    this.url = init.url || null;\n    // Cache the ok value to avoid defining a getter.\n    this.ok = this.status >= 200 && this.status < 300;\n  }\n}\n/**\n * A partial HTTP response which only includes the status and header data,\n * but no response body.\n *\n * `HttpHeaderResponse` is a `HttpEvent` available on the response\n * event stream, only when progress events are requested.\n *\n * @publicApi\n */\nclass HttpHeaderResponse extends HttpResponseBase {\n  /**\n   * Create a new `HttpHeaderResponse` with the given parameters.\n   */\n  constructor(init = {}) {\n    super(init);\n  }\n  type = HttpEventType.ResponseHeader;\n  /**\n   * Copy this `HttpHeaderResponse`, overriding its contents with the\n   * given parameter hash.\n   */\n  clone(update = {}) {\n    // Perform a straightforward initialization of the new HttpHeaderResponse,\n    // overriding the current parameters with new ones if given.\n    return new HttpHeaderResponse({\n      headers: update.headers || this.headers,\n      status: update.status !== undefined ? update.status : this.status,\n      statusText: update.statusText || this.statusText,\n      url: update.url || this.url || undefined\n    });\n  }\n}\n/**\n * A full HTTP response, including a typed response body (which may be `null`\n * if one was not returned).\n *\n * `HttpResponse` is a `HttpEvent` available on the response event\n * stream.\n *\n * @publicApi\n */\nclass HttpResponse extends HttpResponseBase {\n  /**\n   * The response body, or `null` if one was not returned.\n   */\n  body;\n  /**\n   * Construct a new `HttpResponse`.\n   */\n  constructor(init = {}) {\n    super(init);\n    this.body = init.body !== undefined ? init.body : null;\n  }\n  type = HttpEventType.Response;\n  clone(update = {}) {\n    return new HttpResponse({\n      body: update.body !== undefined ? update.body : this.body,\n      headers: update.headers || this.headers,\n      status: update.status !== undefined ? update.status : this.status,\n      statusText: update.statusText || this.statusText,\n      url: update.url || this.url || undefined\n    });\n  }\n}\n/**\n * A response that represents an error or failure, either from a\n * non-successful HTTP status, an error while executing the request,\n * or some other failure which occurred during the parsing of the response.\n *\n * Any error returned on the `Observable` response stream will be\n * wrapped in an `HttpErrorResponse` to provide additional context about\n * the state of the HTTP layer when the error occurred. The error property\n * will contain either a wrapped Error object or the error response returned\n * from the server.\n *\n * @publicApi\n */\nclass HttpErrorResponse extends HttpResponseBase {\n  name = 'HttpErrorResponse';\n  message;\n  error;\n  /**\n   * Errors are never okay, even when the status code is in the 2xx success range.\n   */\n  ok = false;\n  constructor(init) {\n    // Initialize with a default status of 0 / Unknown Error.\n    super(init, 0, 'Unknown Error');\n    // If the response was successful, then this was a parse error. Otherwise, it was\n    // a protocol-level failure of some sort. Either the request failed in transit\n    // or the server returned an unsuccessful status code.\n    if (this.status >= 200 && this.status < 300) {\n      this.message = `Http failure during parsing for ${init.url || '(unknown url)'}`;\n    } else {\n      this.message = `Http failure response for ${init.url || '(unknown url)'}: ${init.status} ${init.statusText}`;\n    }\n    this.error = init.error || null;\n  }\n}\n/**\n * We use these constant to prevent pulling the whole HttpStatusCode enum\n * Those are the only ones referenced directly by the framework\n */\nconst HTTP_STATUS_CODE_OK = 200;\nconst HTTP_STATUS_CODE_NO_CONTENT = 204;\n/**\n * Http status codes.\n * As per https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml\n * @publicApi\n */\nvar HttpStatusCode = /*#__PURE__*/function (HttpStatusCode) {\n  HttpStatusCode[HttpStatusCode[\"Continue\"] = 100] = \"Continue\";\n  HttpStatusCode[HttpStatusCode[\"SwitchingProtocols\"] = 101] = \"SwitchingProtocols\";\n  HttpStatusCode[HttpStatusCode[\"Processing\"] = 102] = \"Processing\";\n  HttpStatusCode[HttpStatusCode[\"EarlyHints\"] = 103] = \"EarlyHints\";\n  HttpStatusCode[HttpStatusCode[\"Ok\"] = 200] = \"Ok\";\n  HttpStatusCode[HttpStatusCode[\"Created\"] = 201] = \"Created\";\n  HttpStatusCode[HttpStatusCode[\"Accepted\"] = 202] = \"Accepted\";\n  HttpStatusCode[HttpStatusCode[\"NonAuthoritativeInformation\"] = 203] = \"NonAuthoritativeInformation\";\n  HttpStatusCode[HttpStatusCode[\"NoContent\"] = 204] = \"NoContent\";\n  HttpStatusCode[HttpStatusCode[\"ResetContent\"] = 205] = \"ResetContent\";\n  HttpStatusCode[HttpStatusCode[\"PartialContent\"] = 206] = \"PartialContent\";\n  HttpStatusCode[HttpStatusCode[\"MultiStatus\"] = 207] = \"MultiStatus\";\n  HttpStatusCode[HttpStatusCode[\"AlreadyReported\"] = 208] = \"AlreadyReported\";\n  HttpStatusCode[HttpStatusCode[\"ImUsed\"] = 226] = \"ImUsed\";\n  HttpStatusCode[HttpStatusCode[\"MultipleChoices\"] = 300] = \"MultipleChoices\";\n  HttpStatusCode[HttpStatusCode[\"MovedPermanently\"] = 301] = \"MovedPermanently\";\n  HttpStatusCode[HttpStatusCode[\"Found\"] = 302] = \"Found\";\n  HttpStatusCode[HttpStatusCode[\"SeeOther\"] = 303] = \"SeeOther\";\n  HttpStatusCode[HttpStatusCode[\"NotModified\"] = 304] = \"NotModified\";\n  HttpStatusCode[HttpStatusCode[\"UseProxy\"] = 305] = \"UseProxy\";\n  HttpStatusCode[HttpStatusCode[\"Unused\"] = 306] = \"Unused\";\n  HttpStatusCode[HttpStatusCode[\"TemporaryRedirect\"] = 307] = \"TemporaryRedirect\";\n  HttpStatusCode[HttpStatusCode[\"PermanentRedirect\"] = 308] = \"PermanentRedirect\";\n  HttpStatusCode[HttpStatusCode[\"BadRequest\"] = 400] = \"BadRequest\";\n  HttpStatusCode[HttpStatusCode[\"Unauthorized\"] = 401] = \"Unauthorized\";\n  HttpStatusCode[HttpStatusCode[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\n  HttpStatusCode[HttpStatusCode[\"Forbidden\"] = 403] = \"Forbidden\";\n  HttpStatusCode[HttpStatusCode[\"NotFound\"] = 404] = \"NotFound\";\n  HttpStatusCode[HttpStatusCode[\"MethodNotAllowed\"] = 405] = \"MethodNotAllowed\";\n  HttpStatusCode[HttpStatusCode[\"NotAcceptable\"] = 406] = \"NotAcceptable\";\n  HttpStatusCode[HttpStatusCode[\"ProxyAuthenticationRequired\"] = 407] = \"ProxyAuthenticationRequired\";\n  HttpStatusCode[HttpStatusCode[\"RequestTimeout\"] = 408] = \"RequestTimeout\";\n  HttpStatusCode[HttpStatusCode[\"Conflict\"] = 409] = \"Conflict\";\n  HttpStatusCode[HttpStatusCode[\"Gone\"] = 410] = \"Gone\";\n  HttpStatusCode[HttpStatusCode[\"LengthRequired\"] = 411] = \"LengthRequired\";\n  HttpStatusCode[HttpStatusCode[\"PreconditionFailed\"] = 412] = \"PreconditionFailed\";\n  HttpStatusCode[HttpStatusCode[\"PayloadTooLarge\"] = 413] = \"PayloadTooLarge\";\n  HttpStatusCode[HttpStatusCode[\"UriTooLong\"] = 414] = \"UriTooLong\";\n  HttpStatusCode[HttpStatusCode[\"UnsupportedMediaType\"] = 415] = \"UnsupportedMediaType\";\n  HttpStatusCode[HttpStatusCode[\"RangeNotSatisfiable\"] = 416] = \"RangeNotSatisfiable\";\n  HttpStatusCode[HttpStatusCode[\"ExpectationFailed\"] = 417] = \"ExpectationFailed\";\n  HttpStatusCode[HttpStatusCode[\"ImATeapot\"] = 418] = \"ImATeapot\";\n  HttpStatusCode[HttpStatusCode[\"MisdirectedRequest\"] = 421] = \"MisdirectedRequest\";\n  HttpStatusCode[HttpStatusCode[\"UnprocessableEntity\"] = 422] = \"UnprocessableEntity\";\n  HttpStatusCode[HttpStatusCode[\"Locked\"] = 423] = \"Locked\";\n  HttpStatusCode[HttpStatusCode[\"FailedDependency\"] = 424] = \"FailedDependency\";\n  HttpStatusCode[HttpStatusCode[\"TooEarly\"] = 425] = \"TooEarly\";\n  HttpStatusCode[HttpStatusCode[\"UpgradeRequired\"] = 426] = \"UpgradeRequired\";\n  HttpStatusCode[HttpStatusCode[\"PreconditionRequired\"] = 428] = \"PreconditionRequired\";\n  HttpStatusCode[HttpStatusCode[\"TooManyRequests\"] = 429] = \"TooManyRequests\";\n  HttpStatusCode[HttpStatusCode[\"RequestHeaderFieldsTooLarge\"] = 431] = \"RequestHeaderFieldsTooLarge\";\n  HttpStatusCode[HttpStatusCode[\"UnavailableForLegalReasons\"] = 451] = \"UnavailableForLegalReasons\";\n  HttpStatusCode[HttpStatusCode[\"InternalServerError\"] = 500] = \"InternalServerError\";\n  HttpStatusCode[HttpStatusCode[\"NotImplemented\"] = 501] = \"NotImplemented\";\n  HttpStatusCode[HttpStatusCode[\"BadGateway\"] = 502] = \"BadGateway\";\n  HttpStatusCode[HttpStatusCode[\"ServiceUnavailable\"] = 503] = \"ServiceUnavailable\";\n  HttpStatusCode[HttpStatusCode[\"GatewayTimeout\"] = 504] = \"GatewayTimeout\";\n  HttpStatusCode[HttpStatusCode[\"HttpVersionNotSupported\"] = 505] = \"HttpVersionNotSupported\";\n  HttpStatusCode[HttpStatusCode[\"VariantAlsoNegotiates\"] = 506] = \"VariantAlsoNegotiates\";\n  HttpStatusCode[HttpStatusCode[\"InsufficientStorage\"] = 507] = \"InsufficientStorage\";\n  HttpStatusCode[HttpStatusCode[\"LoopDetected\"] = 508] = \"LoopDetected\";\n  HttpStatusCode[HttpStatusCode[\"NotExtended\"] = 510] = \"NotExtended\";\n  HttpStatusCode[HttpStatusCode[\"NetworkAuthenticationRequired\"] = 511] = \"NetworkAuthenticationRequired\";\n  return HttpStatusCode;\n}(HttpStatusCode || {});\n/**\n * Constructs an instance of `HttpRequestOptions<T>` from a source `HttpMethodOptions` and\n * the given `body`. This function clones the object and adds the body.\n *\n * Note that the `responseType` *options* value is a String that identifies the\n * single data type of the response.\n * A single overload version of the method handles each response type.\n * The value of `responseType` cannot be a union, as the combined signature could imply.\n *\n */\nfunction addBody(options, body) {\n  return {\n    body,\n    headers: options.headers,\n    context: options.context,\n    observe: options.observe,\n    params: options.params,\n    reportProgress: options.reportProgress,\n    responseType: options.responseType,\n    withCredentials: options.withCredentials,\n    transferCache: options.transferCache\n  };\n}\n/**\n * Performs HTTP requests.\n * This service is available as an injectable class, with methods to perform HTTP requests.\n * Each request method has multiple signatures, and the return type varies based on\n * the signature that is called (mainly the values of `observe` and `responseType`).\n *\n * Note that the `responseType` *options* value is a String that identifies the\n * single data type of the response.\n * A single overload version of the method handles each response type.\n * The value of `responseType` cannot be a union, as the combined signature could imply.\n\n * TODO(adev): review\n * @usageNotes\n *\n * ### HTTP Request Example\n *\n * ```ts\n *  // GET heroes whose name contains search term\n * searchHeroes(term: string): observable<Hero[]>{\n *\n *  const params = new HttpParams({fromString: 'name=term'});\n *    return this.httpClient.request('GET', this.heroesUrl, {responseType:'json', params});\n * }\n * ```\n *\n * Alternatively, the parameter string can be used without invoking HttpParams\n * by directly joining to the URL.\n * ```ts\n * this.httpClient.request('GET', this.heroesUrl + '?' + 'name=term', {responseType:'json'});\n * ```\n *\n *\n * ### JSONP Example\n * ```ts\n * requestJsonp(url, callback = 'callback') {\n *  return this.httpClient.jsonp(this.heroesURL, callback);\n * }\n * ```\n *\n * ### PATCH Example\n * ```ts\n * // PATCH one of the heroes' name\n * patchHero (id: number, heroName: string): Observable<{}> {\n * const url = `${this.heroesUrl}/${id}`;   // PATCH api/heroes/42\n *  return this.httpClient.patch(url, {name: heroName}, httpOptions)\n *    .pipe(catchError(this.handleError('patchHero')));\n * }\n * ```\n *\n * @see [HTTP Guide](guide/http)\n * @see [HTTP Request](api/common/http/HttpRequest)\n *\n * @publicApi\n */\nlet HttpClient = /*#__PURE__*/(() => {\n  class HttpClient {\n    handler;\n    constructor(handler) {\n      this.handler = handler;\n    }\n    /**\n     * Constructs an observable for a generic HTTP request that, when subscribed,\n     * fires the request through the chain of registered interceptors and on to the\n     * server.\n     *\n     * You can pass an `HttpRequest` directly as the only parameter. In this case,\n     * the call returns an observable of the raw `HttpEvent` stream.\n     *\n     * Alternatively you can pass an HTTP method as the first parameter,\n     * a URL string as the second, and an options hash containing the request body as the third.\n     * See `addBody()`. In this case, the specified `responseType` and `observe` options determine the\n     * type of returned observable.\n     *   * The `responseType` value determines how a successful response body is parsed.\n     *   * If `responseType` is the default `json`, you can pass a type interface for the resulting\n     * object as a type parameter to the call.\n     *\n     * The `observe` value determines the return type, according to what you are interested in\n     * observing.\n     *   * An `observe` value of events returns an observable of the raw `HttpEvent` stream, including\n     * progress events by default.\n     *   * An `observe` value of response returns an observable of `HttpResponse<T>`,\n     * where the `T` parameter depends on the `responseType` and any optionally provided type\n     * parameter.\n     *   * An `observe` value of body returns an observable of `<T>` with the same `T` body type.\n     *\n     */\n    request(first, url, options = {}) {\n      let req;\n      // First, check whether the primary argument is an instance of `HttpRequest`.\n      if (first instanceof HttpRequest) {\n        // It is. The other arguments must be undefined (per the signatures) and can be\n        // ignored.\n        req = first;\n      } else {\n        // It's a string, so it represents a URL. Construct a request based on it,\n        // and incorporate the remaining arguments (assuming `GET` unless a method is\n        // provided.\n        // Figure out the headers.\n        let headers = undefined;\n        if (options.headers instanceof HttpHeaders) {\n          headers = options.headers;\n        } else {\n          headers = new HttpHeaders(options.headers);\n        }\n        // Sort out parameters.\n        let params = undefined;\n        if (!!options.params) {\n          if (options.params instanceof HttpParams) {\n            params = options.params;\n          } else {\n            params = new HttpParams({\n              fromObject: options.params\n            });\n          }\n        }\n        // Construct the request.\n        req = new HttpRequest(first, url, options.body !== undefined ? options.body : null, {\n          headers,\n          context: options.context,\n          params,\n          reportProgress: options.reportProgress,\n          // By default, JSON is assumed to be returned for all calls.\n          responseType: options.responseType || 'json',\n          withCredentials: options.withCredentials,\n          transferCache: options.transferCache\n        });\n      }\n      // Start with an Observable.of() the initial request, and run the handler (which\n      // includes all interceptors) inside a concatMap(). This way, the handler runs\n      // inside an Observable chain, which causes interceptors to be re-run on every\n      // subscription (this also makes retries re-run the handler, including interceptors).\n      const events$ = of(req).pipe(concatMap(req => this.handler.handle(req)));\n      // If coming via the API signature which accepts a previously constructed HttpRequest,\n      // the only option is to get the event stream. Otherwise, return the event stream if\n      // that is what was requested.\n      if (first instanceof HttpRequest || options.observe === 'events') {\n        return events$;\n      }\n      // The requested stream contains either the full response or the body. In either\n      // case, the first step is to filter the event stream to extract a stream of\n      // responses(s).\n      const res$ = events$.pipe(filter(event => event instanceof HttpResponse));\n      // Decide which stream to return.\n      switch (options.observe || 'body') {\n        case 'body':\n          // The requested stream is the body. Map the response stream to the response\n          // body. This could be done more simply, but a misbehaving interceptor might\n          // transform the response body into a different format and ignore the requested\n          // responseType. Guard against this by validating that the response is of the\n          // requested type.\n          switch (req.responseType) {\n            case 'arraybuffer':\n              return res$.pipe(map(res => {\n                // Validate that the body is an ArrayBuffer.\n                if (res.body !== null && !(res.body instanceof ArrayBuffer)) {\n                  throw new Error('Response is not an ArrayBuffer.');\n                }\n                return res.body;\n              }));\n            case 'blob':\n              return res$.pipe(map(res => {\n                // Validate that the body is a Blob.\n                if (res.body !== null && !(res.body instanceof Blob)) {\n                  throw new Error('Response is not a Blob.');\n                }\n                return res.body;\n              }));\n            case 'text':\n              return res$.pipe(map(res => {\n                // Validate that the body is a string.\n                if (res.body !== null && typeof res.body !== 'string') {\n                  throw new Error('Response is not a string.');\n                }\n                return res.body;\n              }));\n            case 'json':\n            default:\n              // No validation needed for JSON responses, as they can be of any type.\n              return res$.pipe(map(res => res.body));\n          }\n        case 'response':\n          // The response stream was requested directly, so return it.\n          return res$;\n        default:\n          // Guard against new future observe types being added.\n          throw new Error(`Unreachable: unhandled observe type ${options.observe}}`);\n      }\n    }\n    /**\n     * Constructs an observable that, when subscribed, causes the configured\n     * `DELETE` request to execute on the server. See the individual overloads for\n     * details on the return type.\n     *\n     * @param url     The endpoint URL.\n     * @param options The HTTP options to send with the request.\n     *\n     */\n    delete(url, options = {}) {\n      return this.request('DELETE', url, options);\n    }\n    /**\n     * Constructs an observable that, when subscribed, causes the configured\n     * `GET` request to execute on the server. See the individual overloads for\n     * details on the return type.\n     */\n    get(url, options = {}) {\n      return this.request('GET', url, options);\n    }\n    /**\n     * Constructs an observable that, when subscribed, causes the configured\n     * `HEAD` request to execute on the server. The `HEAD` method returns\n     * meta information about the resource without transferring the\n     * resource itself. See the individual overloads for\n     * details on the return type.\n     */\n    head(url, options = {}) {\n      return this.request('HEAD', url, options);\n    }\n    /**\n     * Constructs an `Observable` that, when subscribed, causes a request with the special method\n     * `JSONP` to be dispatched via the interceptor pipeline.\n     * The [JSONP pattern](https://en.wikipedia.org/wiki/JSONP) works around limitations of certain\n     * API endpoints that don't support newer,\n     * and preferable [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) protocol.\n     * JSONP treats the endpoint API as a JavaScript file and tricks the browser to process the\n     * requests even if the API endpoint is not located on the same domain (origin) as the client-side\n     * application making the request.\n     * The endpoint API must support JSONP callback for JSONP requests to work.\n     * The resource API returns the JSON response wrapped in a callback function.\n     * You can pass the callback function name as one of the query parameters.\n     * Note that JSONP requests can only be used with `GET` requests.\n     *\n     * @param url The resource URL.\n     * @param callbackParam The callback function name.\n     *\n     */\n    jsonp(url, callbackParam) {\n      return this.request('JSONP', url, {\n        params: new HttpParams().append(callbackParam, 'JSONP_CALLBACK'),\n        observe: 'body',\n        responseType: 'json'\n      });\n    }\n    /**\n     * Constructs an `Observable` that, when subscribed, causes the configured\n     * `OPTIONS` request to execute on the server. This method allows the client\n     * to determine the supported HTTP methods and other capabilities of an endpoint,\n     * without implying a resource action. See the individual overloads for\n     * details on the return type.\n     */\n    options(url, options = {}) {\n      return this.request('OPTIONS', url, options);\n    }\n    /**\n     * Constructs an observable that, when subscribed, causes the configured\n     * `PATCH` request to execute on the server. See the individual overloads for\n     * details on the return type.\n     */\n    patch(url, body, options = {}) {\n      return this.request('PATCH', url, addBody(options, body));\n    }\n    /**\n     * Constructs an observable that, when subscribed, causes the configured\n     * `POST` request to execute on the server. The server responds with the location of\n     * the replaced resource. See the individual overloads for\n     * details on the return type.\n     */\n    post(url, body, options = {}) {\n      return this.request('POST', url, addBody(options, body));\n    }\n    /**\n     * Constructs an observable that, when subscribed, causes the configured\n     * `PUT` request to execute on the server. The `PUT` method replaces an existing resource\n     * with a new set of values.\n     * See the individual overloads for details on the return type.\n     */\n    put(url, body, options = {}) {\n      return this.request('PUT', url, addBody(options, body));\n    }\n    static ɵfac = function HttpClient_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || HttpClient)(i0.ɵɵinject(HttpHandler));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: HttpClient,\n      factory: HttpClient.ɵfac\n    });\n  }\n  return HttpClient;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst XSSI_PREFIX$1 = /^\\)\\]\\}',?\\n/;\n/**\n * Determine an appropriate URL for the response, by checking either\n * response url or the X-Request-URL header.\n */\nfunction getResponseUrl$1(response) {\n  if (response.url) {\n    return response.url;\n  }\n  // stored as lowercase in the map\n  const xRequestUrl = X_REQUEST_URL_HEADER.toLocaleLowerCase();\n  return response.headers.get(xRequestUrl);\n}\n/**\n * An internal injection token to reference `FetchBackend` implementation\n * in a tree-shakable way.\n */\nconst FETCH_BACKEND = /*#__PURE__*/new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'FETCH_BACKEND' : '');\n/**\n * Uses `fetch` to send requests to a backend server.\n *\n * This `FetchBackend` requires the support of the\n * [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) which is available on all\n * supported browsers and on Node.js v18 or later.\n *\n * @see {@link HttpHandler}\n *\n * @publicApi\n */\nlet FetchBackend = /*#__PURE__*/(() => {\n  class FetchBackend {\n    // We use an arrow function to always reference the current global implementation of `fetch`.\n    // This is helpful for cases when the global `fetch` implementation is modified by external code,\n    // see https://github.com/angular/angular/issues/57527.\n    fetchImpl = inject(FetchFactory, {\n      optional: true\n    })?.fetch ?? ((...args) => globalThis.fetch(...args));\n    ngZone = inject(NgZone);\n    handle(request) {\n      return new Observable(observer => {\n        const aborter = new AbortController();\n        this.doRequest(request, aborter.signal, observer).then(noop, error => observer.error(new HttpErrorResponse({\n          error\n        })));\n        return () => aborter.abort();\n      });\n    }\n    async doRequest(request, signal, observer) {\n      const init = this.createRequestInit(request);\n      let response;\n      try {\n        // Run fetch outside of Angular zone.\n        // This is due to Node.js fetch implementation (Undici) which uses a number of setTimeouts to check if\n        // the response should eventually timeout which causes extra CD cycles every 500ms\n        const fetchPromise = this.ngZone.runOutsideAngular(() => this.fetchImpl(request.urlWithParams, {\n          signal,\n          ...init\n        }));\n        // Make sure Zone.js doesn't trigger false-positive unhandled promise\n        // error in case the Promise is rejected synchronously. See function\n        // description for additional information.\n        silenceSuperfluousUnhandledPromiseRejection(fetchPromise);\n        // Send the `Sent` event before awaiting the response.\n        observer.next({\n          type: HttpEventType.Sent\n        });\n        response = await fetchPromise;\n      } catch (error) {\n        observer.error(new HttpErrorResponse({\n          error,\n          status: error.status ?? 0,\n          statusText: error.statusText,\n          url: request.urlWithParams,\n          headers: error.headers\n        }));\n        return;\n      }\n      const headers = new HttpHeaders(response.headers);\n      const statusText = response.statusText;\n      const url = getResponseUrl$1(response) ?? request.urlWithParams;\n      let status = response.status;\n      let body = null;\n      if (request.reportProgress) {\n        observer.next(new HttpHeaderResponse({\n          headers,\n          status,\n          statusText,\n          url\n        }));\n      }\n      if (response.body) {\n        // Read Progress\n        const contentLength = response.headers.get('content-length');\n        const chunks = [];\n        const reader = response.body.getReader();\n        let receivedLength = 0;\n        let decoder;\n        let partialText;\n        // We have to check whether the Zone is defined in the global scope because this may be called\n        // when the zone is nooped.\n        const reqZone = typeof Zone !== 'undefined' && Zone.current;\n        // Perform response processing outside of Angular zone to\n        // ensure no excessive change detection runs are executed\n        // Here calling the async ReadableStreamDefaultReader.read() is responsible for triggering CD\n        await this.ngZone.runOutsideAngular(async () => {\n          while (true) {\n            const {\n              done,\n              value\n            } = await reader.read();\n            if (done) {\n              break;\n            }\n            chunks.push(value);\n            receivedLength += value.length;\n            if (request.reportProgress) {\n              partialText = request.responseType === 'text' ? (partialText ?? '') + (decoder ??= new TextDecoder()).decode(value, {\n                stream: true\n              }) : undefined;\n              const reportProgress = () => observer.next({\n                type: HttpEventType.DownloadProgress,\n                total: contentLength ? +contentLength : undefined,\n                loaded: receivedLength,\n                partialText\n              });\n              reqZone ? reqZone.run(reportProgress) : reportProgress();\n            }\n          }\n        });\n        // Combine all chunks.\n        const chunksAll = this.concatChunks(chunks, receivedLength);\n        try {\n          const contentType = response.headers.get(CONTENT_TYPE_HEADER) ?? '';\n          body = this.parseBody(request, chunksAll, contentType);\n        } catch (error) {\n          // Body loading or parsing failed\n          observer.error(new HttpErrorResponse({\n            error,\n            headers: new HttpHeaders(response.headers),\n            status: response.status,\n            statusText: response.statusText,\n            url: getResponseUrl$1(response) ?? request.urlWithParams\n          }));\n          return;\n        }\n      }\n      // Same behavior as the XhrBackend\n      if (status === 0) {\n        status = body ? HTTP_STATUS_CODE_OK : 0;\n      }\n      // ok determines whether the response will be transmitted on the event or\n      // error channel. Unsuccessful status codes (not 2xx) will always be errors,\n      // but a successful status code can still result in an error if the user\n      // asked for JSON data and the body cannot be parsed as such.\n      const ok = status >= 200 && status < 300;\n      if (ok) {\n        observer.next(new HttpResponse({\n          body,\n          headers,\n          status,\n          statusText,\n          url\n        }));\n        // The full body has been received and delivered, no further events\n        // are possible. This request is complete.\n        observer.complete();\n      } else {\n        observer.error(new HttpErrorResponse({\n          error: body,\n          headers,\n          status,\n          statusText,\n          url\n        }));\n      }\n    }\n    parseBody(request, binContent, contentType) {\n      switch (request.responseType) {\n        case 'json':\n          // stripping the XSSI when present\n          const text = new TextDecoder().decode(binContent).replace(XSSI_PREFIX$1, '');\n          return text === '' ? null : JSON.parse(text);\n        case 'text':\n          return new TextDecoder().decode(binContent);\n        case 'blob':\n          return new Blob([binContent], {\n            type: contentType\n          });\n        case 'arraybuffer':\n          return binContent.buffer;\n      }\n    }\n    createRequestInit(req) {\n      // We could share some of this logic with the XhrBackend\n      const headers = {};\n      const credentials = req.withCredentials ? 'include' : undefined;\n      // Setting all the requested headers.\n      req.headers.forEach((name, values) => headers[name] = values.join(','));\n      // Add an Accept header if one isn't present already.\n      if (!req.headers.has('Accept')) {\n        headers['Accept'] = ACCEPT_HEADER;\n      }\n      // Auto-detect the Content-Type header if one isn't present already.\n      if (!req.headers.has(CONTENT_TYPE_HEADER)) {\n        const detectedType = req.detectContentTypeHeader();\n        // Sometimes Content-Type detection fails.\n        if (detectedType !== null) {\n          headers[CONTENT_TYPE_HEADER] = detectedType;\n        }\n      }\n      return {\n        body: req.serializeBody(),\n        method: req.method,\n        headers,\n        credentials\n      };\n    }\n    concatChunks(chunks, totalLength) {\n      const chunksAll = new Uint8Array(totalLength);\n      let position = 0;\n      for (const chunk of chunks) {\n        chunksAll.set(chunk, position);\n        position += chunk.length;\n      }\n      return chunksAll;\n    }\n    static ɵfac = function FetchBackend_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || FetchBackend)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: FetchBackend,\n      factory: FetchBackend.ɵfac\n    });\n  }\n  return FetchBackend;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Abstract class to provide a mocked implementation of `fetch()`\n */\nclass FetchFactory {}\nfunction noop() {}\n/**\n * Zone.js treats a rejected promise that has not yet been awaited\n * as an unhandled error. This function adds a noop `.then` to make\n * sure that Zone.js doesn't throw an error if the Promise is rejected\n * synchronously.\n */\nfunction silenceSuperfluousUnhandledPromiseRejection(promise) {\n  promise.then(noop, noop);\n}\nfunction interceptorChainEndFn(req, finalHandlerFn) {\n  return finalHandlerFn(req);\n}\n/**\n * Constructs a `ChainedInterceptorFn` which adapts a legacy `HttpInterceptor` to the\n * `ChainedInterceptorFn` interface.\n */\nfunction adaptLegacyInterceptorToChain(chainTailFn, interceptor) {\n  return (initialRequest, finalHandlerFn) => interceptor.intercept(initialRequest, {\n    handle: downstreamRequest => chainTailFn(downstreamRequest, finalHandlerFn)\n  });\n}\n/**\n * Constructs a `ChainedInterceptorFn` which wraps and invokes a functional interceptor in the given\n * injector.\n */\nfunction chainedInterceptorFn(chainTailFn, interceptorFn, injector) {\n  return (initialRequest, finalHandlerFn) => runInInjectionContext(injector, () => interceptorFn(initialRequest, downstreamRequest => chainTailFn(downstreamRequest, finalHandlerFn)));\n}\n/**\n * A multi-provider token that represents the array of registered\n * `HttpInterceptor` objects.\n *\n * @publicApi\n */\nconst HTTP_INTERCEPTORS = /*#__PURE__*/new InjectionToken(ngDevMode ? 'HTTP_INTERCEPTORS' : '');\n/**\n * A multi-provided token of `HttpInterceptorFn`s.\n */\nconst HTTP_INTERCEPTOR_FNS = /*#__PURE__*/new InjectionToken(ngDevMode ? 'HTTP_INTERCEPTOR_FNS' : '');\n/**\n * A multi-provided token of `HttpInterceptorFn`s that are only set in root.\n */\nconst HTTP_ROOT_INTERCEPTOR_FNS = /*#__PURE__*/new InjectionToken(ngDevMode ? 'HTTP_ROOT_INTERCEPTOR_FNS' : '');\n// TODO(atscott): We need a larger discussion about stability and what should contribute to stability.\n// Should the whole interceptor chain contribute to stability or just the backend request #55075?\n// Should HttpClient contribute to stability automatically at all?\nconst REQUESTS_CONTRIBUTE_TO_STABILITY = /*#__PURE__*/new InjectionToken(ngDevMode ? 'REQUESTS_CONTRIBUTE_TO_STABILITY' : '', {\n  providedIn: 'root',\n  factory: () => true\n});\n/**\n * Creates an `HttpInterceptorFn` which lazily initializes an interceptor chain from the legacy\n * class-based interceptors and runs the request through it.\n */\nfunction legacyInterceptorFnFactory() {\n  let chain = null;\n  return (req, handler) => {\n    if (chain === null) {\n      const interceptors = inject(HTTP_INTERCEPTORS, {\n        optional: true\n      }) ?? [];\n      // Note: interceptors are wrapped right-to-left so that final execution order is\n      // left-to-right. That is, if `interceptors` is the array `[a, b, c]`, we want to\n      // produce a chain that is conceptually `c(b(a(end)))`, which we build from the inside\n      // out.\n      chain = interceptors.reduceRight(adaptLegacyInterceptorToChain, interceptorChainEndFn);\n    }\n    const pendingTasks = inject(ɵPendingTasksInternal);\n    const contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);\n    if (contributeToStability) {\n      const taskId = pendingTasks.add();\n      return chain(req, handler).pipe(finalize(() => pendingTasks.remove(taskId)));\n    } else {\n      return chain(req, handler);\n    }\n  };\n}\nlet fetchBackendWarningDisplayed = false;\n/** Internal function to reset the flag in tests */\nfunction resetFetchBackendWarningFlag() {\n  fetchBackendWarningDisplayed = false;\n}\nlet HttpInterceptorHandler = /*#__PURE__*/(() => {\n  class HttpInterceptorHandler extends HttpHandler {\n    backend;\n    injector;\n    chain = null;\n    pendingTasks = inject(ɵPendingTasksInternal);\n    contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);\n    constructor(backend, injector) {\n      super();\n      this.backend = backend;\n      this.injector = injector;\n      // We strongly recommend using fetch backend for HTTP calls when SSR is used\n      // for an application. The logic below checks if that's the case and produces\n      // a warning otherwise.\n      if ((typeof ngDevMode === 'undefined' || ngDevMode) && !fetchBackendWarningDisplayed) {\n        const isServer = isPlatformServer(injector.get(PLATFORM_ID));\n        // This flag is necessary because provideHttpClientTesting() overrides the backend\n        // even if `withFetch()` is used within the test. When the testing HTTP backend is provided,\n        // no HTTP calls are actually performed during the test, so producing a warning would be\n        // misleading.\n        const isTestingBackend = this.backend.isTestingBackend;\n        if (isServer && !(this.backend instanceof FetchBackend) && !isTestingBackend) {\n          fetchBackendWarningDisplayed = true;\n          injector.get(ɵConsole).warn(ɵformatRuntimeError(2801 /* RuntimeErrorCode.NOT_USING_FETCH_BACKEND_IN_SSR */, 'Angular detected that `HttpClient` is not configured ' + \"to use `fetch` APIs. It's strongly recommended to \" + 'enable `fetch` for applications that use Server-Side Rendering ' + 'for better performance and compatibility. ' + 'To enable `fetch`, add the `withFetch()` to the `provideHttpClient()` ' + 'call at the root of the application.'));\n        }\n      }\n    }\n    handle(initialRequest) {\n      if (this.chain === null) {\n        const dedupedInterceptorFns = Array.from(new Set([...this.injector.get(HTTP_INTERCEPTOR_FNS), ...this.injector.get(HTTP_ROOT_INTERCEPTOR_FNS, [])]));\n        // Note: interceptors are wrapped right-to-left so that final execution order is\n        // left-to-right. That is, if `dedupedInterceptorFns` is the array `[a, b, c]`, we want to\n        // produce a chain that is conceptually `c(b(a(end)))`, which we build from the inside\n        // out.\n        this.chain = dedupedInterceptorFns.reduceRight((nextSequencedFn, interceptorFn) => chainedInterceptorFn(nextSequencedFn, interceptorFn, this.injector), interceptorChainEndFn);\n      }\n      if (this.contributeToStability) {\n        const taskId = this.pendingTasks.add();\n        return this.chain(initialRequest, downstreamRequest => this.backend.handle(downstreamRequest)).pipe(finalize(() => this.pendingTasks.remove(taskId)));\n      } else {\n        return this.chain(initialRequest, downstreamRequest => this.backend.handle(downstreamRequest));\n      }\n    }\n    static ɵfac = function HttpInterceptorHandler_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || HttpInterceptorHandler)(i0.ɵɵinject(HttpBackend), i0.ɵɵinject(i0.EnvironmentInjector));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: HttpInterceptorHandler,\n      factory: HttpInterceptorHandler.ɵfac\n    });\n  }\n  return HttpInterceptorHandler;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n// Every request made through JSONP needs a callback name that's unique across the\n// whole page. Each request is assigned an id and the callback name is constructed\n// from that. The next id to be assigned is tracked in a global variable here that\n// is shared among all applications on the page.\nlet nextRequestId = 0;\n/**\n * When a pending <script> is unsubscribed we'll move it to this document, so it won't be\n * executed.\n */\nlet foreignDocument;\n// Error text given when a JSONP script is injected, but doesn't invoke the callback\n// passed in its URL.\nconst JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';\n// Error text given when a request is passed to the JsonpClientBackend that doesn't\n// have a request method JSONP.\nconst JSONP_ERR_WRONG_METHOD = 'JSONP requests must use JSONP request method.';\nconst JSONP_ERR_WRONG_RESPONSE_TYPE = 'JSONP requests must use Json response type.';\n// Error text given when a request is passed to the JsonpClientBackend that has\n// headers set\nconst JSONP_ERR_HEADERS_NOT_SUPPORTED = 'JSONP requests do not support headers.';\n/**\n * DI token/abstract type representing a map of JSONP callbacks.\n *\n * In the browser, this should always be the `window` object.\n *\n *\n */\nclass JsonpCallbackContext {}\n/**\n * Factory function that determines where to store JSONP callbacks.\n *\n * Ordinarily JSONP callbacks are stored on the `window` object, but this may not exist\n * in test environments. In that case, callbacks are stored on an anonymous object instead.\n *\n *\n */\nfunction jsonpCallbackContext() {\n  if (typeof window === 'object') {\n    return window;\n  }\n  return {};\n}\n/**\n * Processes an `HttpRequest` with the JSONP method,\n * by performing JSONP style requests.\n * @see {@link HttpHandler}\n * @see {@link HttpXhrBackend}\n *\n * @publicApi\n */\nlet JsonpClientBackend = /*#__PURE__*/(() => {\n  class JsonpClientBackend {\n    callbackMap;\n    document;\n    /**\n     * A resolved promise that can be used to schedule microtasks in the event handlers.\n     */\n    resolvedPromise = Promise.resolve();\n    constructor(callbackMap, document) {\n      this.callbackMap = callbackMap;\n      this.document = document;\n    }\n    /**\n     * Get the name of the next callback method, by incrementing the global `nextRequestId`.\n     */\n    nextCallback() {\n      return `ng_jsonp_callback_${nextRequestId++}`;\n    }\n    /**\n     * Processes a JSONP request and returns an event stream of the results.\n     * @param req The request object.\n     * @returns An observable of the response events.\n     *\n     */\n    handle(req) {\n      // Firstly, check both the method and response type. If either doesn't match\n      // then the request was improperly routed here and cannot be handled.\n      if (req.method !== 'JSONP') {\n        throw new Error(JSONP_ERR_WRONG_METHOD);\n      } else if (req.responseType !== 'json') {\n        throw new Error(JSONP_ERR_WRONG_RESPONSE_TYPE);\n      }\n      // Check the request headers. JSONP doesn't support headers and\n      // cannot set any that were supplied.\n      if (req.headers.keys().length > 0) {\n        throw new Error(JSONP_ERR_HEADERS_NOT_SUPPORTED);\n      }\n      // Everything else happens inside the Observable boundary.\n      return new Observable(observer => {\n        // The first step to make a request is to generate the callback name, and replace the\n        // callback placeholder in the URL with the name. Care has to be taken here to ensure\n        // a trailing &, if matched, gets inserted back into the URL in the correct place.\n        const callback = this.nextCallback();\n        const url = req.urlWithParams.replace(/=JSONP_CALLBACK(&|$)/, `=${callback}$1`);\n        // Construct the <script> tag and point it at the URL.\n        const node = this.document.createElement('script');\n        node.src = url;\n        // A JSONP request requires waiting for multiple callbacks. These variables\n        // are closed over and track state across those callbacks.\n        // The response object, if one has been received, or null otherwise.\n        let body = null;\n        // Whether the response callback has been called.\n        let finished = false;\n        // Set the response callback in this.callbackMap (which will be the window\n        // object in the browser. The script being loaded via the <script> tag will\n        // eventually call this callback.\n        this.callbackMap[callback] = data => {\n          // Data has been received from the JSONP script. Firstly, delete this callback.\n          delete this.callbackMap[callback];\n          // Set state to indicate data was received.\n          body = data;\n          finished = true;\n        };\n        // cleanup() is a utility closure that removes the <script> from the page and\n        // the response callback from the window. This logic is used in both the\n        // success, error, and cancellation paths, so it's extracted out for convenience.\n        const cleanup = () => {\n          node.removeEventListener('load', onLoad);\n          node.removeEventListener('error', onError);\n          // Remove the <script> tag if it's still on the page.\n          node.remove();\n          // Remove the response callback from the callbackMap (window object in the\n          // browser).\n          delete this.callbackMap[callback];\n        };\n        // onLoad() is the success callback which runs after the response callback\n        // if the JSONP script loads successfully. The event itself is unimportant.\n        // If something went wrong, onLoad() may run without the response callback\n        // having been invoked.\n        const onLoad = event => {\n          // We wrap it in an extra Promise, to ensure the microtask\n          // is scheduled after the loaded endpoint has executed any potential microtask itself,\n          // which is not guaranteed in Internet Explorer and EdgeHTML. See issue #39496\n          this.resolvedPromise.then(() => {\n            // Cleanup the page.\n            cleanup();\n            // Check whether the response callback has run.\n            if (!finished) {\n              // It hasn't, something went wrong with the request. Return an error via\n              // the Observable error path. All JSONP errors have status 0.\n              observer.error(new HttpErrorResponse({\n                url,\n                status: 0,\n                statusText: 'JSONP Error',\n                error: new Error(JSONP_ERR_NO_CALLBACK)\n              }));\n              return;\n            }\n            // Success. body either contains the response body or null if none was\n            // returned.\n            observer.next(new HttpResponse({\n              body,\n              status: HTTP_STATUS_CODE_OK,\n              statusText: 'OK',\n              url\n            }));\n            // Complete the stream, the response is over.\n            observer.complete();\n          });\n        };\n        // onError() is the error callback, which runs if the script returned generates\n        // a Javascript error. It emits the error via the Observable error channel as\n        // a HttpErrorResponse.\n        const onError = error => {\n          cleanup();\n          // Wrap the error in a HttpErrorResponse.\n          observer.error(new HttpErrorResponse({\n            error,\n            status: 0,\n            statusText: 'JSONP Error',\n            url\n          }));\n        };\n        // Subscribe to both the success (load) and error events on the <script> tag,\n        // and add it to the page.\n        node.addEventListener('load', onLoad);\n        node.addEventListener('error', onError);\n        this.document.body.appendChild(node);\n        // The request has now been successfully sent.\n        observer.next({\n          type: HttpEventType.Sent\n        });\n        // Cancellation handler.\n        return () => {\n          if (!finished) {\n            this.removeListeners(node);\n          }\n          // And finally, clean up the page.\n          cleanup();\n        };\n      });\n    }\n    removeListeners(script) {\n      // Issue #34818\n      // Changing <script>'s ownerDocument will prevent it from execution.\n      // https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block\n      foreignDocument ??= this.document.implementation.createHTMLDocument();\n      foreignDocument.adoptNode(script);\n    }\n    static ɵfac = function JsonpClientBackend_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || JsonpClientBackend)(i0.ɵɵinject(JsonpCallbackContext), i0.ɵɵinject(DOCUMENT));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: JsonpClientBackend,\n      factory: JsonpClientBackend.ɵfac\n    });\n  }\n  return JsonpClientBackend;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Identifies requests with the method JSONP and shifts them to the `JsonpClientBackend`.\n */\nfunction jsonpInterceptorFn(req, next) {\n  if (req.method === 'JSONP') {\n    return inject(JsonpClientBackend).handle(req);\n  }\n  // Fall through for normal HTTP requests.\n  return next(req);\n}\n/**\n * Identifies requests with the method JSONP and\n * shifts them to the `JsonpClientBackend`.\n *\n * @see {@link HttpInterceptor}\n *\n * @publicApi\n */\nlet JsonpInterceptor = /*#__PURE__*/(() => {\n  class JsonpInterceptor {\n    injector;\n    constructor(injector) {\n      this.injector = injector;\n    }\n    /**\n     * Identifies and handles a given JSONP request.\n     * @param initialRequest The outgoing request object to handle.\n     * @param next The next interceptor in the chain, or the backend\n     * if no interceptors remain in the chain.\n     * @returns An observable of the event stream.\n     */\n    intercept(initialRequest, next) {\n      return runInInjectionContext(this.injector, () => jsonpInterceptorFn(initialRequest, downstreamRequest => next.handle(downstreamRequest)));\n    }\n    static ɵfac = function JsonpInterceptor_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || JsonpInterceptor)(i0.ɵɵinject(i0.EnvironmentInjector));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: JsonpInterceptor,\n      factory: JsonpInterceptor.ɵfac\n    });\n  }\n  return JsonpInterceptor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\nconst X_REQUEST_URL_REGEXP = /*#__PURE__*/RegExp(`^${X_REQUEST_URL_HEADER}:`, 'm');\n/**\n * Determine an appropriate URL for the response, by checking either\n * XMLHttpRequest.responseURL or the X-Request-URL header.\n */\nfunction getResponseUrl(xhr) {\n  if ('responseURL' in xhr && xhr.responseURL) {\n    return xhr.responseURL;\n  }\n  if (X_REQUEST_URL_REGEXP.test(xhr.getAllResponseHeaders())) {\n    return xhr.getResponseHeader(X_REQUEST_URL_HEADER);\n  }\n  return null;\n}\n/**\n * Uses `XMLHttpRequest` to send requests to a backend server.\n * @see {@link HttpHandler}\n * @see {@link JsonpClientBackend}\n *\n * @publicApi\n */\nlet HttpXhrBackend = /*#__PURE__*/(() => {\n  class HttpXhrBackend {\n    xhrFactory;\n    constructor(xhrFactory) {\n      this.xhrFactory = xhrFactory;\n    }\n    /**\n     * Processes a request and returns a stream of response events.\n     * @param req The request object.\n     * @returns An observable of the response events.\n     */\n    handle(req) {\n      // Quick check to give a better error message when a user attempts to use\n      // HttpClient.jsonp() without installing the HttpClientJsonpModule\n      if (req.method === 'JSONP') {\n        throw new ɵRuntimeError(-2800 /* RuntimeErrorCode.MISSING_JSONP_MODULE */, (typeof ngDevMode === 'undefined' || ngDevMode) && `Cannot make a JSONP request without JSONP support. To fix the problem, either add the \\`withJsonpSupport()\\` call (if \\`provideHttpClient()\\` is used) or import the \\`HttpClientJsonpModule\\` in the root NgModule.`);\n      }\n      // Check whether this factory has a special function to load an XHR implementation\n      // for various non-browser environments. We currently limit it to only `ServerXhr`\n      // class, which needs to load an XHR implementation.\n      const xhrFactory = this.xhrFactory;\n      const source = xhrFactory.ɵloadImpl ? from(xhrFactory.ɵloadImpl()) : of(null);\n      return source.pipe(switchMap(() => {\n        // Everything happens on Observable subscription.\n        return new Observable(observer => {\n          // Start by setting up the XHR object with request method, URL, and withCredentials\n          // flag.\n          const xhr = xhrFactory.build();\n          xhr.open(req.method, req.urlWithParams);\n          if (req.withCredentials) {\n            xhr.withCredentials = true;\n          }\n          // Add all the requested headers.\n          req.headers.forEach((name, values) => xhr.setRequestHeader(name, values.join(',')));\n          // Add an Accept header if one isn't present already.\n          if (!req.headers.has('Accept')) {\n            xhr.setRequestHeader('Accept', ACCEPT_HEADER);\n          }\n          // Auto-detect the Content-Type header if one isn't present already.\n          if (!req.headers.has(CONTENT_TYPE_HEADER)) {\n            const detectedType = req.detectContentTypeHeader();\n            // Sometimes Content-Type detection fails.\n            if (detectedType !== null) {\n              xhr.setRequestHeader(CONTENT_TYPE_HEADER, detectedType);\n            }\n          }\n          // Set the responseType if one was requested.\n          if (req.responseType) {\n            const responseType = req.responseType.toLowerCase();\n            // JSON responses need to be processed as text. This is because if the server\n            // returns an XSSI-prefixed JSON response, the browser will fail to parse it,\n            // xhr.response will be null, and xhr.responseText cannot be accessed to\n            // retrieve the prefixed JSON data in order to strip the prefix. Thus, all JSON\n            // is parsed by first requesting text and then applying JSON.parse.\n            xhr.responseType = responseType !== 'json' ? responseType : 'text';\n          }\n          // Serialize the request body if one is present. If not, this will be set to null.\n          const reqBody = req.serializeBody();\n          // If progress events are enabled, response headers will be delivered\n          // in two events - the HttpHeaderResponse event and the full HttpResponse\n          // event. However, since response headers don't change in between these\n          // two events, it doesn't make sense to parse them twice. So headerResponse\n          // caches the data extracted from the response whenever it's first parsed,\n          // to ensure parsing isn't duplicated.\n          let headerResponse = null;\n          // partialFromXhr extracts the HttpHeaderResponse from the current XMLHttpRequest\n          // state, and memoizes it into headerResponse.\n          const partialFromXhr = () => {\n            if (headerResponse !== null) {\n              return headerResponse;\n            }\n            const statusText = xhr.statusText || 'OK';\n            // Parse headers from XMLHttpRequest - this step is lazy.\n            const headers = new HttpHeaders(xhr.getAllResponseHeaders());\n            // Read the response URL from the XMLHttpResponse instance and fall back on the\n            // request URL.\n            const url = getResponseUrl(xhr) || req.url;\n            // Construct the HttpHeaderResponse and memoize it.\n            headerResponse = new HttpHeaderResponse({\n              headers,\n              status: xhr.status,\n              statusText,\n              url\n            });\n            return headerResponse;\n          };\n          // Next, a few closures are defined for the various events which XMLHttpRequest can\n          // emit. This allows them to be unregistered as event listeners later.\n          // First up is the load event, which represents a response being fully available.\n          const onLoad = () => {\n            // Read response state from the memoized partial data.\n            let {\n              headers,\n              status,\n              statusText,\n              url\n            } = partialFromXhr();\n            // The body will be read out if present.\n            let body = null;\n            if (status !== HTTP_STATUS_CODE_NO_CONTENT) {\n              // Use XMLHttpRequest.response if set, responseText otherwise.\n              body = typeof xhr.response === 'undefined' ? xhr.responseText : xhr.response;\n            }\n            // Normalize another potential bug (this one comes from CORS).\n            if (status === 0) {\n              status = !!body ? HTTP_STATUS_CODE_OK : 0;\n            }\n            // ok determines whether the response will be transmitted on the event or\n            // error channel. Unsuccessful status codes (not 2xx) will always be errors,\n            // but a successful status code can still result in an error if the user\n            // asked for JSON data and the body cannot be parsed as such.\n            let ok = status >= 200 && status < 300;\n            // Check whether the body needs to be parsed as JSON (in many cases the browser\n            // will have done that already).\n            if (req.responseType === 'json' && typeof body === 'string') {\n              // Save the original body, before attempting XSSI prefix stripping.\n              const originalBody = body;\n              body = body.replace(XSSI_PREFIX, '');\n              try {\n                // Attempt the parse. If it fails, a parse error should be delivered to the\n                // user.\n                body = body !== '' ? JSON.parse(body) : null;\n              } catch (error) {\n                // Since the JSON.parse failed, it's reasonable to assume this might not have\n                // been a JSON response. Restore the original body (including any XSSI prefix)\n                // to deliver a better error response.\n                body = originalBody;\n                // If this was an error request to begin with, leave it as a string, it\n                // probably just isn't JSON. Otherwise, deliver the parsing error to the user.\n                if (ok) {\n                  // Even though the response status was 2xx, this is still an error.\n                  ok = false;\n                  // The parse error contains the text of the body that failed to parse.\n                  body = {\n                    error,\n                    text: body\n                  };\n                }\n              }\n            }\n            if (ok) {\n              // A successful response is delivered on the event stream.\n              observer.next(new HttpResponse({\n                body,\n                headers,\n                status,\n                statusText,\n                url: url || undefined\n              }));\n              // The full body has been received and delivered, no further events\n              // are possible. This request is complete.\n              observer.complete();\n            } else {\n              // An unsuccessful request is delivered on the error channel.\n              observer.error(new HttpErrorResponse({\n                // The error in this case is the response body (error from the server).\n                error: body,\n                headers,\n                status,\n                statusText,\n                url: url || undefined\n              }));\n            }\n          };\n          // The onError callback is called when something goes wrong at the network level.\n          // Connection timeout, DNS error, offline, etc. These are actual errors, and are\n          // transmitted on the error channel.\n          const onError = error => {\n            const {\n              url\n            } = partialFromXhr();\n            const res = new HttpErrorResponse({\n              error,\n              status: xhr.status || 0,\n              statusText: xhr.statusText || 'Unknown Error',\n              url: url || undefined\n            });\n            observer.error(res);\n          };\n          // The sentHeaders flag tracks whether the HttpResponseHeaders event\n          // has been sent on the stream. This is necessary to track if progress\n          // is enabled since the event will be sent on only the first download\n          // progress event.\n          let sentHeaders = false;\n          // The download progress event handler, which is only registered if\n          // progress events are enabled.\n          const onDownProgress = event => {\n            // Send the HttpResponseHeaders event if it hasn't been sent already.\n            if (!sentHeaders) {\n              observer.next(partialFromXhr());\n              sentHeaders = true;\n            }\n            // Start building the download progress event to deliver on the response\n            // event stream.\n            let progressEvent = {\n              type: HttpEventType.DownloadProgress,\n              loaded: event.loaded\n            };\n            // Set the total number of bytes in the event if it's available.\n            if (event.lengthComputable) {\n              progressEvent.total = event.total;\n            }\n            // If the request was for text content and a partial response is\n            // available on XMLHttpRequest, include it in the progress event\n            // to allow for streaming reads.\n            if (req.responseType === 'text' && !!xhr.responseText) {\n              progressEvent.partialText = xhr.responseText;\n            }\n            // Finally, fire the event.\n            observer.next(progressEvent);\n          };\n          // The upload progress event handler, which is only registered if\n          // progress events are enabled.\n          const onUpProgress = event => {\n            // Upload progress events are simpler. Begin building the progress\n            // event.\n            let progress = {\n              type: HttpEventType.UploadProgress,\n              loaded: event.loaded\n            };\n            // If the total number of bytes being uploaded is available, include\n            // it.\n            if (event.lengthComputable) {\n              progress.total = event.total;\n            }\n            // Send the event.\n            observer.next(progress);\n          };\n          // By default, register for load and error events.\n          xhr.addEventListener('load', onLoad);\n          xhr.addEventListener('error', onError);\n          xhr.addEventListener('timeout', onError);\n          xhr.addEventListener('abort', onError);\n          // Progress events are only enabled if requested.\n          if (req.reportProgress) {\n            // Download progress is always enabled if requested.\n            xhr.addEventListener('progress', onDownProgress);\n            // Upload progress depends on whether there is a body to upload.\n            if (reqBody !== null && xhr.upload) {\n              xhr.upload.addEventListener('progress', onUpProgress);\n            }\n          }\n          // Fire the request, and notify the event stream that it was fired.\n          xhr.send(reqBody);\n          observer.next({\n            type: HttpEventType.Sent\n          });\n          // This is the return from the Observable function, which is the\n          // request cancellation handler.\n          return () => {\n            // On a cancellation, remove all registered event listeners.\n            xhr.removeEventListener('error', onError);\n            xhr.removeEventListener('abort', onError);\n            xhr.removeEventListener('load', onLoad);\n            xhr.removeEventListener('timeout', onError);\n            if (req.reportProgress) {\n              xhr.removeEventListener('progress', onDownProgress);\n              if (reqBody !== null && xhr.upload) {\n                xhr.upload.removeEventListener('progress', onUpProgress);\n              }\n            }\n            // Finally, abort the in-flight request.\n            if (xhr.readyState !== xhr.DONE) {\n              xhr.abort();\n            }\n          };\n        });\n      }));\n    }\n    static ɵfac = function HttpXhrBackend_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || HttpXhrBackend)(i0.ɵɵinject(i1.XhrFactory));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: HttpXhrBackend,\n      factory: HttpXhrBackend.ɵfac\n    });\n  }\n  return HttpXhrBackend;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst XSRF_ENABLED = /*#__PURE__*/new InjectionToken(ngDevMode ? 'XSRF_ENABLED' : '');\nconst XSRF_DEFAULT_COOKIE_NAME = 'XSRF-TOKEN';\nconst XSRF_COOKIE_NAME = /*#__PURE__*/new InjectionToken(ngDevMode ? 'XSRF_COOKIE_NAME' : '', {\n  providedIn: 'root',\n  factory: () => XSRF_DEFAULT_COOKIE_NAME\n});\nconst XSRF_DEFAULT_HEADER_NAME = 'X-XSRF-TOKEN';\nconst XSRF_HEADER_NAME = /*#__PURE__*/new InjectionToken(ngDevMode ? 'XSRF_HEADER_NAME' : '', {\n  providedIn: 'root',\n  factory: () => XSRF_DEFAULT_HEADER_NAME\n});\n/**\n * Retrieves the current XSRF token to use with the next outgoing request.\n *\n * @publicApi\n */\nclass HttpXsrfTokenExtractor {}\n/**\n * `HttpXsrfTokenExtractor` which retrieves the token from a cookie.\n */\nlet HttpXsrfCookieExtractor = /*#__PURE__*/(() => {\n  class HttpXsrfCookieExtractor {\n    doc;\n    platform;\n    cookieName;\n    lastCookieString = '';\n    lastToken = null;\n    /**\n     * @internal for testing\n     */\n    parseCount = 0;\n    constructor(doc, platform, cookieName) {\n      this.doc = doc;\n      this.platform = platform;\n      this.cookieName = cookieName;\n    }\n    getToken() {\n      if (this.platform === 'server') {\n        return null;\n      }\n      const cookieString = this.doc.cookie || '';\n      if (cookieString !== this.lastCookieString) {\n        this.parseCount++;\n        this.lastToken = ɵparseCookieValue(cookieString, this.cookieName);\n        this.lastCookieString = cookieString;\n      }\n      return this.lastToken;\n    }\n    static ɵfac = function HttpXsrfCookieExtractor_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || HttpXsrfCookieExtractor)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(PLATFORM_ID), i0.ɵɵinject(XSRF_COOKIE_NAME));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: HttpXsrfCookieExtractor,\n      factory: HttpXsrfCookieExtractor.ɵfac\n    });\n  }\n  return HttpXsrfCookieExtractor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nfunction xsrfInterceptorFn(req, next) {\n  const lcUrl = req.url.toLowerCase();\n  // Skip both non-mutating requests and absolute URLs.\n  // Non-mutating requests don't require a token, and absolute URLs require special handling\n  // anyway as the cookie set\n  // on our origin is not the same as the token expected by another origin.\n  if (!inject(XSRF_ENABLED) || req.method === 'GET' || req.method === 'HEAD' || lcUrl.startsWith('http://') || lcUrl.startsWith('https://')) {\n    return next(req);\n  }\n  const token = inject(HttpXsrfTokenExtractor).getToken();\n  const headerName = inject(XSRF_HEADER_NAME);\n  // Be careful not to overwrite an existing header of the same name.\n  if (token != null && !req.headers.has(headerName)) {\n    req = req.clone({\n      headers: req.headers.set(headerName, token)\n    });\n  }\n  return next(req);\n}\n/**\n * `HttpInterceptor` which adds an XSRF token to eligible outgoing requests.\n */\nlet HttpXsrfInterceptor = /*#__PURE__*/(() => {\n  class HttpXsrfInterceptor {\n    injector;\n    constructor(injector) {\n      this.injector = injector;\n    }\n    intercept(initialRequest, next) {\n      return runInInjectionContext(this.injector, () => xsrfInterceptorFn(initialRequest, downstreamRequest => next.handle(downstreamRequest)));\n    }\n    static ɵfac = function HttpXsrfInterceptor_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || HttpXsrfInterceptor)(i0.ɵɵinject(i0.EnvironmentInjector));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: HttpXsrfInterceptor,\n      factory: HttpXsrfInterceptor.ɵfac\n    });\n  }\n  return HttpXsrfInterceptor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Identifies a particular kind of `HttpFeature`.\n *\n * @publicApi\n */\nvar HttpFeatureKind = /*#__PURE__*/function (HttpFeatureKind) {\n  HttpFeatureKind[HttpFeatureKind[\"Interceptors\"] = 0] = \"Interceptors\";\n  HttpFeatureKind[HttpFeatureKind[\"LegacyInterceptors\"] = 1] = \"LegacyInterceptors\";\n  HttpFeatureKind[HttpFeatureKind[\"CustomXsrfConfiguration\"] = 2] = \"CustomXsrfConfiguration\";\n  HttpFeatureKind[HttpFeatureKind[\"NoXsrfProtection\"] = 3] = \"NoXsrfProtection\";\n  HttpFeatureKind[HttpFeatureKind[\"JsonpSupport\"] = 4] = \"JsonpSupport\";\n  HttpFeatureKind[HttpFeatureKind[\"RequestsMadeViaParent\"] = 5] = \"RequestsMadeViaParent\";\n  HttpFeatureKind[HttpFeatureKind[\"Fetch\"] = 6] = \"Fetch\";\n  return HttpFeatureKind;\n}(HttpFeatureKind || {});\nfunction makeHttpFeature(kind, providers) {\n  return {\n    ɵkind: kind,\n    ɵproviders: providers\n  };\n}\n/**\n * Configures Angular's `HttpClient` service to be available for injection.\n *\n * By default, `HttpClient` will be configured for injection with its default options for XSRF\n * protection of outgoing requests. Additional configuration options can be provided by passing\n * feature functions to `provideHttpClient`. For example, HTTP interceptors can be added using the\n * `withInterceptors(...)` feature.\n *\n * <div class=\"docs-alert docs-alert-helpful\">\n *\n * It's strongly recommended to enable\n * [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) for applications that use\n * Server-Side Rendering for better performance and compatibility. To enable `fetch`, add\n * `withFetch()` feature to the `provideHttpClient()` call at the root of the application:\n *\n * ```ts\n * provideHttpClient(withFetch());\n * ```\n *\n * </div>\n *\n * @see {@link withInterceptors}\n * @see {@link withInterceptorsFromDi}\n * @see {@link withXsrfConfiguration}\n * @see {@link withNoXsrfProtection}\n * @see {@link withJsonpSupport}\n * @see {@link withRequestsMadeViaParent}\n * @see {@link withFetch}\n */\nfunction provideHttpClient(...features) {\n  if (ngDevMode) {\n    const featureKinds = new Set(features.map(f => f.ɵkind));\n    if (featureKinds.has(HttpFeatureKind.NoXsrfProtection) && featureKinds.has(HttpFeatureKind.CustomXsrfConfiguration)) {\n      throw new Error(ngDevMode ? `Configuration error: found both withXsrfConfiguration() and withNoXsrfProtection() in the same call to provideHttpClient(), which is a contradiction.` : '');\n    }\n  }\n  const providers = [HttpClient, HttpXhrBackend, HttpInterceptorHandler, {\n    provide: HttpHandler,\n    useExisting: HttpInterceptorHandler\n  }, {\n    provide: HttpBackend,\n    useFactory: () => {\n      return inject(FETCH_BACKEND, {\n        optional: true\n      }) ?? inject(HttpXhrBackend);\n    }\n  }, {\n    provide: HTTP_INTERCEPTOR_FNS,\n    useValue: xsrfInterceptorFn,\n    multi: true\n  }, {\n    provide: XSRF_ENABLED,\n    useValue: true\n  }, {\n    provide: HttpXsrfTokenExtractor,\n    useClass: HttpXsrfCookieExtractor\n  }];\n  for (const feature of features) {\n    providers.push(...feature.ɵproviders);\n  }\n  return makeEnvironmentProviders(providers);\n}\n/**\n * Adds one or more functional-style HTTP interceptors to the configuration of the `HttpClient`\n * instance.\n *\n * @see {@link HttpInterceptorFn}\n * @see {@link provideHttpClient}\n * @publicApi\n */\nfunction withInterceptors(interceptorFns) {\n  return makeHttpFeature(HttpFeatureKind.Interceptors, interceptorFns.map(interceptorFn => {\n    return {\n      provide: HTTP_INTERCEPTOR_FNS,\n      useValue: interceptorFn,\n      multi: true\n    };\n  }));\n}\nconst LEGACY_INTERCEPTOR_FN = /*#__PURE__*/new InjectionToken(ngDevMode ? 'LEGACY_INTERCEPTOR_FN' : '');\n/**\n * Includes class-based interceptors configured using a multi-provider in the current injector into\n * the configured `HttpClient` instance.\n *\n * Prefer `withInterceptors` and functional interceptors instead, as support for DI-provided\n * interceptors may be phased out in a later release.\n *\n * @see {@link HttpInterceptor}\n * @see {@link HTTP_INTERCEPTORS}\n * @see {@link provideHttpClient}\n */\nfunction withInterceptorsFromDi() {\n  // Note: the legacy interceptor function is provided here via an intermediate token\n  // (`LEGACY_INTERCEPTOR_FN`), using a pattern which guarantees that if these providers are\n  // included multiple times, all of the multi-provider entries will have the same instance of the\n  // interceptor function. That way, the `HttpINterceptorHandler` will dedup them and legacy\n  // interceptors will not run multiple times.\n  return makeHttpFeature(HttpFeatureKind.LegacyInterceptors, [{\n    provide: LEGACY_INTERCEPTOR_FN,\n    useFactory: legacyInterceptorFnFactory\n  }, {\n    provide: HTTP_INTERCEPTOR_FNS,\n    useExisting: LEGACY_INTERCEPTOR_FN,\n    multi: true\n  }]);\n}\n/**\n * Customizes the XSRF protection for the configuration of the current `HttpClient` instance.\n *\n * This feature is incompatible with the `withNoXsrfProtection` feature.\n *\n * @see {@link provideHttpClient}\n */\nfunction withXsrfConfiguration({\n  cookieName,\n  headerName\n}) {\n  const providers = [];\n  if (cookieName !== undefined) {\n    providers.push({\n      provide: XSRF_COOKIE_NAME,\n      useValue: cookieName\n    });\n  }\n  if (headerName !== undefined) {\n    providers.push({\n      provide: XSRF_HEADER_NAME,\n      useValue: headerName\n    });\n  }\n  return makeHttpFeature(HttpFeatureKind.CustomXsrfConfiguration, providers);\n}\n/**\n * Disables XSRF protection in the configuration of the current `HttpClient` instance.\n *\n * This feature is incompatible with the `withXsrfConfiguration` feature.\n *\n * @see {@link provideHttpClient}\n */\nfunction withNoXsrfProtection() {\n  return makeHttpFeature(HttpFeatureKind.NoXsrfProtection, [{\n    provide: XSRF_ENABLED,\n    useValue: false\n  }]);\n}\n/**\n * Add JSONP support to the configuration of the current `HttpClient` instance.\n *\n * @see {@link provideHttpClient}\n */\nfunction withJsonpSupport() {\n  return makeHttpFeature(HttpFeatureKind.JsonpSupport, [JsonpClientBackend, {\n    provide: JsonpCallbackContext,\n    useFactory: jsonpCallbackContext\n  }, {\n    provide: HTTP_INTERCEPTOR_FNS,\n    useValue: jsonpInterceptorFn,\n    multi: true\n  }]);\n}\n/**\n * Configures the current `HttpClient` instance to make requests via the parent injector's\n * `HttpClient` instead of directly.\n *\n * By default, `provideHttpClient` configures `HttpClient` in its injector to be an independent\n * instance. For example, even if `HttpClient` is configured in the parent injector with\n * one or more interceptors, they will not intercept requests made via this instance.\n *\n * With this option enabled, once the request has passed through the current injector's\n * interceptors, it will be delegated to the parent injector's `HttpClient` chain instead of\n * dispatched directly, and interceptors in the parent configuration will be applied to the request.\n *\n * If there are several `HttpClient` instances in the injector hierarchy, it's possible for\n * `withRequestsMadeViaParent` to be used at multiple levels, which will cause the request to\n * \"bubble up\" until either reaching the root level or an `HttpClient` which was not configured with\n * this option.\n *\n * @see {@link provideHttpClient}\n * @publicApi\n */\nfunction withRequestsMadeViaParent() {\n  return makeHttpFeature(HttpFeatureKind.RequestsMadeViaParent, [{\n    provide: HttpBackend,\n    useFactory: () => {\n      const handlerFromParent = inject(HttpHandler, {\n        skipSelf: true,\n        optional: true\n      });\n      if (ngDevMode && handlerFromParent === null) {\n        throw new Error('withRequestsMadeViaParent() can only be used when the parent injector also configures HttpClient');\n      }\n      return handlerFromParent;\n    }\n  }]);\n}\n/**\n * Configures the current `HttpClient` instance to make requests using the fetch API.\n *\n * Note: The Fetch API doesn't support progress report on uploads.\n *\n * @publicApi\n */\nfunction withFetch() {\n  return makeHttpFeature(HttpFeatureKind.Fetch, [FetchBackend, {\n    provide: FETCH_BACKEND,\n    useExisting: FetchBackend\n  }, {\n    provide: HttpBackend,\n    useExisting: FetchBackend\n  }]);\n}\n\n/**\n * Configures XSRF protection support for outgoing requests.\n *\n * For a server that supports a cookie-based XSRF protection system,\n * use directly to configure XSRF protection with the correct\n * cookie and header names.\n *\n * If no names are supplied, the default cookie name is `XSRF-TOKEN`\n * and the default header name is `X-XSRF-TOKEN`.\n *\n * @publicApi\n * @deprecated Use withXsrfConfiguration({cookieName: 'XSRF-TOKEN', headerName: 'X-XSRF-TOKEN'}) as\n *     providers instead or `withNoXsrfProtection` if you want to disabled XSRF protection.\n */\nlet HttpClientXsrfModule = /*#__PURE__*/(() => {\n  class HttpClientXsrfModule {\n    /**\n     * Disable the default XSRF protection.\n     */\n    static disable() {\n      return {\n        ngModule: HttpClientXsrfModule,\n        providers: [withNoXsrfProtection().ɵproviders]\n      };\n    }\n    /**\n     * Configure XSRF protection.\n     * @param options An object that can specify either or both\n     * cookie name or header name.\n     * - Cookie name default is `XSRF-TOKEN`.\n     * - Header name default is `X-XSRF-TOKEN`.\n     *\n     */\n    static withOptions(options = {}) {\n      return {\n        ngModule: HttpClientXsrfModule,\n        providers: withXsrfConfiguration(options).ɵproviders\n      };\n    }\n    static ɵfac = function HttpClientXsrfModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || HttpClientXsrfModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: HttpClientXsrfModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      providers: [HttpXsrfInterceptor, {\n        provide: HTTP_INTERCEPTORS,\n        useExisting: HttpXsrfInterceptor,\n        multi: true\n      }, {\n        provide: HttpXsrfTokenExtractor,\n        useClass: HttpXsrfCookieExtractor\n      }, withXsrfConfiguration({\n        cookieName: XSRF_DEFAULT_COOKIE_NAME,\n        headerName: XSRF_DEFAULT_HEADER_NAME\n      }).ɵproviders, {\n        provide: XSRF_ENABLED,\n        useValue: true\n      }]\n    });\n  }\n  return HttpClientXsrfModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Configures the dependency injector for `HttpClient`\n * with supporting services for XSRF. Automatically imported by `HttpClientModule`.\n *\n * You can add interceptors to the chain behind `HttpClient` by binding them to the\n * multiprovider for built-in DI token `HTTP_INTERCEPTORS`.\n *\n * @publicApi\n * @deprecated use `provideHttpClient(withInterceptorsFromDi())` as providers instead\n */\nlet HttpClientModule = /*#__PURE__*/(() => {\n  class HttpClientModule {\n    static ɵfac = function HttpClientModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || HttpClientModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: HttpClientModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      providers: [provideHttpClient(withInterceptorsFromDi())]\n    });\n  }\n  return HttpClientModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Configures the dependency injector for `HttpClient`\n * with supporting services for JSONP.\n * Without this module, Jsonp requests reach the backend\n * with method JSONP, where they are rejected.\n *\n * @publicApi\n * @deprecated `withJsonpSupport()` as providers instead\n */\nlet HttpClientJsonpModule = /*#__PURE__*/(() => {\n  class HttpClientJsonpModule {\n    static ɵfac = function HttpClientJsonpModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || HttpClientJsonpModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: HttpClientJsonpModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      providers: [withJsonpSupport().ɵproviders]\n    });\n  }\n  return HttpClientJsonpModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * If your application uses different HTTP origins to make API calls (via `HttpClient`) on the server and\n * on the client, the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token allows you to establish a mapping\n * between those origins, so that `HttpTransferCache` feature can recognize those requests as the same\n * ones and reuse the data cached on the server during hydration on the client.\n *\n * **Important note**: the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token should *only* be provided in\n * the *server* code of your application (typically in the `app.server.config.ts` script). Angular throws an\n * error if it detects that the token is defined while running on the client.\n *\n * @usageNotes\n *\n * When the same API endpoint is accessed via `http://internal-domain.com:8080` on the server and\n * via `https://external-domain.com` on the client, you can use the following configuration:\n * ```ts\n * // in app.server.config.ts\n * {\n *     provide: HTTP_TRANSFER_CACHE_ORIGIN_MAP,\n *     useValue: {\n *         'http://internal-domain.com:8080': 'https://external-domain.com'\n *     }\n * }\n * ```\n *\n * @publicApi\n */\nconst HTTP_TRANSFER_CACHE_ORIGIN_MAP = /*#__PURE__*/new InjectionToken(ngDevMode ? 'HTTP_TRANSFER_CACHE_ORIGIN_MAP' : '');\n/**\n * Keys within cached response data structure.\n */\nconst BODY = 'b';\nconst HEADERS = 'h';\nconst STATUS = 's';\nconst STATUS_TEXT = 'st';\nconst REQ_URL = 'u';\nconst RESPONSE_TYPE = 'rt';\nconst CACHE_OPTIONS = /*#__PURE__*/new InjectionToken(ngDevMode ? 'HTTP_TRANSFER_STATE_CACHE_OPTIONS' : '');\n/**\n * A list of allowed HTTP methods to cache.\n */\nconst ALLOWED_METHODS = ['GET', 'HEAD'];\nfunction transferCacheInterceptorFn(req, next) {\n  const {\n    isCacheActive,\n    ...globalOptions\n  } = inject(CACHE_OPTIONS);\n  const {\n    transferCache: requestOptions,\n    method: requestMethod\n  } = req;\n  // In the following situations we do not want to cache the request\n  if (!isCacheActive || requestOptions === false ||\n  // POST requests are allowed either globally or at request level\n  requestMethod === 'POST' && !globalOptions.includePostRequests && !requestOptions || requestMethod !== 'POST' && !ALLOWED_METHODS.includes(requestMethod) ||\n  // Do not cache request that require authorization when includeRequestsWithAuthHeaders is falsey\n  !globalOptions.includeRequestsWithAuthHeaders && hasAuthHeaders(req) || globalOptions.filter?.(req) === false) {\n    return next(req);\n  }\n  const transferState = inject(TransferState);\n  const originMap = inject(HTTP_TRANSFER_CACHE_ORIGIN_MAP, {\n    optional: true\n  });\n  if (typeof ngServerMode !== 'undefined' && !ngServerMode && originMap) {\n    throw new ɵRuntimeError(2803 /* RuntimeErrorCode.HTTP_ORIGIN_MAP_USED_IN_CLIENT */, ngDevMode && 'Angular detected that the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token is configured and ' + 'present in the client side code. Please ensure that this token is only provided in the ' + 'server code of the application.');\n  }\n  const requestUrl = typeof ngServerMode !== 'undefined' && ngServerMode && originMap ? mapRequestOriginUrl(req.url, originMap) : req.url;\n  const storeKey = makeCacheKey(req, requestUrl);\n  const response = transferState.get(storeKey, null);\n  let headersToInclude = globalOptions.includeHeaders;\n  if (typeof requestOptions === 'object' && requestOptions.includeHeaders) {\n    // Request-specific config takes precedence over the global config.\n    headersToInclude = requestOptions.includeHeaders;\n  }\n  if (response) {\n    const {\n      [BODY]: undecodedBody,\n      [RESPONSE_TYPE]: responseType,\n      [HEADERS]: httpHeaders,\n      [STATUS]: status,\n      [STATUS_TEXT]: statusText,\n      [REQ_URL]: url\n    } = response;\n    // Request found in cache. Respond using it.\n    let body = undecodedBody;\n    switch (responseType) {\n      case 'arraybuffer':\n        body = new TextEncoder().encode(undecodedBody).buffer;\n        break;\n      case 'blob':\n        body = new Blob([undecodedBody]);\n        break;\n    }\n    // We want to warn users accessing a header provided from the cache\n    // That HttpTransferCache alters the headers\n    // The warning will be logged a single time by HttpHeaders instance\n    let headers = new HttpHeaders(httpHeaders);\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      // Append extra logic in dev mode to produce a warning when a header\n      // that was not transferred to the client is accessed in the code via `get`\n      // and `has` calls.\n      headers = appendMissingHeadersDetection(req.url, headers, headersToInclude ?? []);\n    }\n    return of(new HttpResponse({\n      body,\n      headers,\n      status,\n      statusText,\n      url\n    }));\n  }\n  // Request not found in cache. Make the request and cache it if on the server.\n  return next(req).pipe(tap(event => {\n    if (event instanceof HttpResponse && typeof ngServerMode !== 'undefined' && ngServerMode) {\n      transferState.set(storeKey, {\n        [BODY]: event.body,\n        [HEADERS]: getFilteredHeaders(event.headers, headersToInclude),\n        [STATUS]: event.status,\n        [STATUS_TEXT]: event.statusText,\n        [REQ_URL]: requestUrl,\n        [RESPONSE_TYPE]: req.responseType\n      });\n    }\n  }));\n}\n/** @returns true when the requests contains autorization related headers. */\nfunction hasAuthHeaders(req) {\n  return req.headers.has('authorization') || req.headers.has('proxy-authorization');\n}\nfunction getFilteredHeaders(headers, includeHeaders) {\n  if (!includeHeaders) {\n    return {};\n  }\n  const headersMap = {};\n  for (const key of includeHeaders) {\n    const values = headers.getAll(key);\n    if (values !== null) {\n      headersMap[key] = values;\n    }\n  }\n  return headersMap;\n}\nfunction sortAndConcatParams(params) {\n  return [...params.keys()].sort().map(k => `${k}=${params.getAll(k)}`).join('&');\n}\nfunction makeCacheKey(request, mappedRequestUrl) {\n  // make the params encoded same as a url so it's easy to identify\n  const {\n    params,\n    method,\n    responseType\n  } = request;\n  const encodedParams = sortAndConcatParams(params);\n  let serializedBody = request.serializeBody();\n  if (serializedBody instanceof URLSearchParams) {\n    serializedBody = sortAndConcatParams(serializedBody);\n  } else if (typeof serializedBody !== 'string') {\n    serializedBody = '';\n  }\n  const key = [method, responseType, mappedRequestUrl, serializedBody, encodedParams].join('|');\n  const hash = generateHash(key);\n  return makeStateKey(hash);\n}\n/**\n * A method that returns a hash representation of a string using a variant of DJB2 hash\n * algorithm.\n *\n * This is the same hashing logic that is used to generate component ids.\n */\nfunction generateHash(value) {\n  let hash = 0;\n  for (const char of value) {\n    hash = Math.imul(31, hash) + char.charCodeAt(0) << 0;\n  }\n  // Force positive number hash.\n  // 2147483647 = equivalent of Integer.MAX_VALUE.\n  hash += 2147483647 + 1;\n  return hash.toString();\n}\n/**\n * Returns the DI providers needed to enable HTTP transfer cache.\n *\n * By default, when using server rendering, requests are performed twice: once on the server and\n * other one on the browser.\n *\n * When these providers are added, requests performed on the server are cached and reused during the\n * bootstrapping of the application in the browser thus avoiding duplicate requests and reducing\n * load time.\n *\n */\nfunction withHttpTransferCache(cacheOptions) {\n  return [{\n    provide: CACHE_OPTIONS,\n    useFactory: () => {\n      ɵperformanceMarkFeature('NgHttpTransferCache');\n      return {\n        isCacheActive: true,\n        ...cacheOptions\n      };\n    }\n  }, {\n    provide: HTTP_ROOT_INTERCEPTOR_FNS,\n    useValue: transferCacheInterceptorFn,\n    multi: true,\n    deps: [TransferState, CACHE_OPTIONS]\n  }, {\n    provide: APP_BOOTSTRAP_LISTENER,\n    multi: true,\n    useFactory: () => {\n      const appRef = inject(ApplicationRef);\n      const cacheState = inject(CACHE_OPTIONS);\n      return () => {\n        appRef.whenStable().then(() => {\n          cacheState.isCacheActive = false;\n        });\n      };\n    }\n  }];\n}\n/**\n * This function will add a proxy to an HttpHeader to intercept calls to get/has\n * and log a warning if the header entry requested has been removed\n */\nfunction appendMissingHeadersDetection(url, headers, headersToInclude) {\n  const warningProduced = new Set();\n  return new Proxy(headers, {\n    get(target, prop) {\n      const value = Reflect.get(target, prop);\n      const methods = new Set(['get', 'has', 'getAll']);\n      if (typeof value !== 'function' || !methods.has(prop)) {\n        return value;\n      }\n      return headerName => {\n        // We log when the key has been removed and a warning hasn't been produced for the header\n        const key = (prop + ':' + headerName).toLowerCase(); // e.g. `get:cache-control`\n        if (!headersToInclude.includes(headerName) && !warningProduced.has(key)) {\n          warningProduced.add(key);\n          const truncatedUrl = ɵtruncateMiddle(url);\n          // TODO: create Error guide for this warning\n          console.warn(ɵformatRuntimeError(2802 /* RuntimeErrorCode.HEADERS_ALTERED_BY_TRANSFER_CACHE */, `Angular detected that the \\`${headerName}\\` header is accessed, but the value of the header ` + `was not transferred from the server to the client by the HttpTransferCache. ` + `To include the value of the \\`${headerName}\\` header for the \\`${truncatedUrl}\\` request, ` + `use the \\`includeHeaders\\` list. The \\`includeHeaders\\` can be defined either ` + `on a request level by adding the \\`transferCache\\` parameter, or on an application ` + `level by adding the \\`httpCacheTransfer.includeHeaders\\` argument to the ` + `\\`provideClientHydration()\\` call. `));\n        }\n        // invoking the original method\n        return value.apply(target, [headerName]);\n      };\n    }\n  });\n}\nfunction mapRequestOriginUrl(url, originMap) {\n  const origin = new URL(url, 'resolve://').origin;\n  const mappedOrigin = originMap[origin];\n  if (!mappedOrigin) {\n    return url;\n  }\n  if (typeof ngDevMode === 'undefined' || ngDevMode) {\n    verifyMappedOrigin(mappedOrigin);\n  }\n  return url.replace(origin, mappedOrigin);\n}\nfunction verifyMappedOrigin(url) {\n  if (new URL(url, 'resolve://').pathname !== '/') {\n    throw new ɵRuntimeError(2804 /* RuntimeErrorCode.HTTP_ORIGIN_MAP_CONTAINS_PATH */, 'Angular detected a URL with a path segment in the value provided for the ' + `\\`HTTP_TRANSFER_CACHE_ORIGIN_MAP\\` token: ${url}. The map should only contain origins ` + 'without any other segments.');\n  }\n}\n\n// This file is not used to build this module. It is only used during editing\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { FetchBackend, HTTP_INTERCEPTORS, HTTP_TRANSFER_CACHE_ORIGIN_MAP, HttpBackend, HttpClient, HttpClientJsonpModule, HttpClientModule, HttpClientXsrfModule, HttpContext, HttpContextToken, HttpErrorResponse, HttpEventType, HttpFeatureKind, HttpHandler, HttpHeaderResponse, HttpHeaders, HttpParams, HttpRequest, HttpResponse, HttpResponseBase, HttpStatusCode, HttpUrlEncodingCodec, HttpXhrBackend, HttpXsrfTokenExtractor, JsonpClientBackend, JsonpInterceptor, provideHttpClient, withFetch, withInterceptors, withInterceptorsFromDi, withJsonpSupport, withNoXsrfProtection, withRequestsMadeViaParent, withXsrfConfiguration, HTTP_ROOT_INTERCEPTOR_FNS as ɵHTTP_ROOT_INTERCEPTOR_FNS, HttpInterceptorHandler as ɵHttpInterceptingHandler, HttpInterceptorHandler as ɵHttpInterceptorHandler, REQUESTS_CONTRIBUTE_TO_STABILITY as ɵREQUESTS_CONTRIBUTE_TO_STABILITY, withHttpTransferCache as ɵwithHttpTransferCache };\n","/**\n * @license Angular v19.1.3\n * (c) 2010-2024 Google LLC. https://angular.io/\n * License: MIT\n */\n\nimport { ɵDomAdapter, ɵsetRootDomAdapter, ɵparseCookieValue, ɵgetDOM, isPlatformServer, DOCUMENT, ɵPLATFORM_BROWSER_ID, XhrFactory, CommonModule } from '@angular/common';\nexport { ɵgetDOM } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { ɵglobal, ɵRuntimeError, Injectable, InjectionToken, Inject, APP_ID, CSP_NONCE, PLATFORM_ID, Optional, ViewEncapsulation, ɵTracingService, RendererStyleFlags2, ɵinternalCreateApplication, ErrorHandler, ɵsetDocument, PLATFORM_INITIALIZER, createPlatformFactory, platformCore, ɵTESTABILITY_GETTER, ɵTESTABILITY, Testability, NgZone, TestabilityRegistry, ɵINJECTOR_SCOPE, RendererFactory2, inject, ApplicationModule, NgModule, ApplicationRef, ɵConsole, Injector, forwardRef, ɵXSS_SECURITY_URL, SecurityContext, ɵallowSanitizationBypassAndThrow, ɵunwrapSafeValue, ɵ_sanitizeUrl, ɵ_sanitizeHtml, ɵbypassSanitizationTrustHtml, ɵbypassSanitizationTrustStyle, ɵbypassSanitizationTrustScript, ɵbypassSanitizationTrustUrl, ɵbypassSanitizationTrustResourceUrl, ɵwithI18nSupport, ɵwithEventReplay, ɵwithIncrementalHydration, ENVIRONMENT_INITIALIZER, ɵZONELESS_ENABLED, ɵformatRuntimeError, makeEnvironmentProviders, ɵwithDomHydration, Version } from '@angular/core';\nimport { ɵwithHttpTransferCache } from '@angular/common/http';\n\n/**\n * Provides DOM operations in any browser environment.\n *\n * @security Tread carefully! Interacting with the DOM directly is dangerous and\n * can introduce XSS risks.\n */\nclass GenericBrowserDomAdapter extends ɵDomAdapter {\n  supportsDOMEvents = true;\n}\n\n/**\n * A `DomAdapter` powered by full browser DOM APIs.\n *\n * @security Tread carefully! Interacting with the DOM directly is dangerous and\n * can introduce XSS risks.\n */\nclass BrowserDomAdapter extends GenericBrowserDomAdapter {\n  static makeCurrent() {\n    ɵsetRootDomAdapter(new BrowserDomAdapter());\n  }\n  onAndCancel(el, evt, listener, options) {\n    el.addEventListener(evt, listener, options);\n    return () => {\n      el.removeEventListener(evt, listener, options);\n    };\n  }\n  dispatchEvent(el, evt) {\n    el.dispatchEvent(evt);\n  }\n  remove(node) {\n    node.remove();\n  }\n  createElement(tagName, doc) {\n    doc = doc || this.getDefaultDocument();\n    return doc.createElement(tagName);\n  }\n  createHtmlDocument() {\n    return document.implementation.createHTMLDocument('fakeTitle');\n  }\n  getDefaultDocument() {\n    return document;\n  }\n  isElementNode(node) {\n    return node.nodeType === Node.ELEMENT_NODE;\n  }\n  isShadowRoot(node) {\n    return node instanceof DocumentFragment;\n  }\n  /** @deprecated No longer being used in Ivy code. To be removed in version 14. */\n  getGlobalEventTarget(doc, target) {\n    if (target === 'window') {\n      return window;\n    }\n    if (target === 'document') {\n      return doc;\n    }\n    if (target === 'body') {\n      return doc.body;\n    }\n    return null;\n  }\n  getBaseHref(doc) {\n    const href = getBaseElementHref();\n    return href == null ? null : relativePath(href);\n  }\n  resetBaseElement() {\n    baseElement = null;\n  }\n  getUserAgent() {\n    return window.navigator.userAgent;\n  }\n  getCookie(name) {\n    return ɵparseCookieValue(document.cookie, name);\n  }\n}\nlet baseElement = null;\nfunction getBaseElementHref() {\n  baseElement = baseElement || document.querySelector('base');\n  return baseElement ? baseElement.getAttribute('href') : null;\n}\nfunction relativePath(url) {\n  // The base URL doesn't really matter, we just need it so relative paths have something\n  // to resolve against. In the browser `HTMLBaseElement.href` is always absolute.\n  return new URL(url, document.baseURI).pathname;\n}\nclass BrowserGetTestability {\n  addToWindow(registry) {\n    ɵglobal['getAngularTestability'] = (elem, findInAncestors = true) => {\n      const testability = registry.findTestabilityInTree(elem, findInAncestors);\n      if (testability == null) {\n        throw new ɵRuntimeError(5103 /* RuntimeErrorCode.TESTABILITY_NOT_FOUND */, (typeof ngDevMode === 'undefined' || ngDevMode) && 'Could not find testability for element.');\n      }\n      return testability;\n    };\n    ɵglobal['getAllAngularTestabilities'] = () => registry.getAllTestabilities();\n    ɵglobal['getAllAngularRootElements'] = () => registry.getAllRootElements();\n    const whenAllStable = callback => {\n      const testabilities = ɵglobal['getAllAngularTestabilities']();\n      let count = testabilities.length;\n      const decrement = function () {\n        count--;\n        if (count == 0) {\n          callback();\n        }\n      };\n      testabilities.forEach(testability => {\n        testability.whenStable(decrement);\n      });\n    };\n    if (!ɵglobal['frameworkStabilizers']) {\n      ɵglobal['frameworkStabilizers'] = [];\n    }\n    ɵglobal['frameworkStabilizers'].push(whenAllStable);\n  }\n  findTestabilityInTree(registry, elem, findInAncestors) {\n    if (elem == null) {\n      return null;\n    }\n    const t = registry.getTestability(elem);\n    if (t != null) {\n      return t;\n    } else if (!findInAncestors) {\n      return null;\n    }\n    if (ɵgetDOM().isShadowRoot(elem)) {\n      return this.findTestabilityInTree(registry, elem.host, true);\n    }\n    return this.findTestabilityInTree(registry, elem.parentElement, true);\n  }\n}\n\n/**\n * A factory for `HttpXhrBackend` that uses the `XMLHttpRequest` browser API.\n */\nlet BrowserXhr = /*#__PURE__*/(() => {\n  class BrowserXhr {\n    build() {\n      return new XMLHttpRequest();\n    }\n    static ɵfac = function BrowserXhr_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || BrowserXhr)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: BrowserXhr,\n      factory: BrowserXhr.ɵfac\n    });\n  }\n  return BrowserXhr;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * The injection token for plugins of the `EventManager` service.\n *\n * @publicApi\n */\nconst EVENT_MANAGER_PLUGINS = /*#__PURE__*/new InjectionToken(ngDevMode ? 'EventManagerPlugins' : '');\n/**\n * An injectable service that provides event management for Angular\n * through a browser plug-in.\n *\n * @publicApi\n */\nlet EventManager = /*#__PURE__*/(() => {\n  class EventManager {\n    _zone;\n    _plugins;\n    _eventNameToPlugin = new Map();\n    /**\n     * Initializes an instance of the event-manager service.\n     */\n    constructor(plugins, _zone) {\n      this._zone = _zone;\n      plugins.forEach(plugin => {\n        plugin.manager = this;\n      });\n      this._plugins = plugins.slice().reverse();\n    }\n    /**\n     * Registers a handler for a specific element and event.\n     *\n     * @param element The HTML element to receive event notifications.\n     * @param eventName The name of the event to listen for.\n     * @param handler A function to call when the notification occurs. Receives the\n     * event object as an argument.\n     * @param options Options that configure how the event listener is bound.\n     * @returns  A callback function that can be used to remove the handler.\n     */\n    addEventListener(element, eventName, handler, options) {\n      const plugin = this._findPluginFor(eventName);\n      return plugin.addEventListener(element, eventName, handler, options);\n    }\n    /**\n     * Retrieves the compilation zone in which event listeners are registered.\n     */\n    getZone() {\n      return this._zone;\n    }\n    /** @internal */\n    _findPluginFor(eventName) {\n      let plugin = this._eventNameToPlugin.get(eventName);\n      if (plugin) {\n        return plugin;\n      }\n      const plugins = this._plugins;\n      plugin = plugins.find(plugin => plugin.supports(eventName));\n      if (!plugin) {\n        throw new ɵRuntimeError(5101 /* RuntimeErrorCode.NO_PLUGIN_FOR_EVENT */, (typeof ngDevMode === 'undefined' || ngDevMode) && `No event manager plugin found for event ${eventName}`);\n      }\n      this._eventNameToPlugin.set(eventName, plugin);\n      return plugin;\n    }\n    static ɵfac = function EventManager_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || EventManager)(i0.ɵɵinject(EVENT_MANAGER_PLUGINS), i0.ɵɵinject(i0.NgZone));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: EventManager,\n      factory: EventManager.ɵfac\n    });\n  }\n  return EventManager;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * The plugin definition for the `EventManager` class\n *\n * It can be used as a base class to create custom manager plugins, i.e. you can create your own\n * class that extends the `EventManagerPlugin` one.\n *\n * @publicApi\n */\nclass EventManagerPlugin {\n  _doc;\n  // TODO: remove (has some usage in G3)\n  constructor(_doc) {\n    this._doc = _doc;\n  }\n  // Using non-null assertion because it's set by EventManager's constructor\n  manager;\n}\n\n/** The style elements attribute name used to set value of `APP_ID` token. */\nconst APP_ID_ATTRIBUTE_NAME = 'ng-app-id';\n/**\n * Removes all provided elements from the document.\n * @param elements An array of HTML Elements.\n */\nfunction removeElements(elements) {\n  for (const element of elements) {\n    element.remove();\n  }\n}\n/**\n * Creates a `style` element with the provided inline style content.\n * @param style A string of the inline style content.\n * @param doc A DOM Document to use to create the element.\n * @returns An HTMLStyleElement instance.\n */\nfunction createStyleElement(style, doc) {\n  const styleElement = doc.createElement('style');\n  styleElement.textContent = style;\n  return styleElement;\n}\n/**\n * Searches a DOM document's head element for style elements with a matching application\n * identifier attribute (`ng-app-id`) to the provide identifier and adds usage records for each.\n * @param doc An HTML DOM document instance.\n * @param appId A string containing an Angular application identifer.\n * @param inline A Map object for tracking inline (defined via `styles` in component decorator) style usage.\n * @param external A Map object for tracking external (defined via `styleUrls` in component decorator) style usage.\n */\nfunction addServerStyles(doc, appId, inline, external) {\n  const elements = doc.head?.querySelectorAll(`style[${APP_ID_ATTRIBUTE_NAME}=\"${appId}\"],link[${APP_ID_ATTRIBUTE_NAME}=\"${appId}\"]`);\n  if (elements) {\n    for (const styleElement of elements) {\n      styleElement.removeAttribute(APP_ID_ATTRIBUTE_NAME);\n      if (styleElement instanceof HTMLLinkElement) {\n        // Only use filename from href\n        // The href is build time generated with a unique value to prevent duplicates.\n        external.set(styleElement.href.slice(styleElement.href.lastIndexOf('/') + 1), {\n          usage: 0,\n          elements: [styleElement]\n        });\n      } else if (styleElement.textContent) {\n        inline.set(styleElement.textContent, {\n          usage: 0,\n          elements: [styleElement]\n        });\n      }\n    }\n  }\n}\n/**\n * Creates a `link` element for the provided external style URL.\n * @param url A string of the URL for the stylesheet.\n * @param doc A DOM Document to use to create the element.\n * @returns An HTMLLinkElement instance.\n */\nfunction createLinkElement(url, doc) {\n  const linkElement = doc.createElement('link');\n  linkElement.setAttribute('rel', 'stylesheet');\n  linkElement.setAttribute('href', url);\n  return linkElement;\n}\nlet SharedStylesHost = /*#__PURE__*/(() => {\n  class SharedStylesHost {\n    doc;\n    appId;\n    nonce;\n    /**\n     * Provides usage information for active inline style content and associated HTML <style> elements.\n     * Embedded styles typically originate from the `styles` metadata of a rendered component.\n     */\n    inline = new Map();\n    /**\n     * Provides usage information for active external style URLs and the associated HTML <link> elements.\n     * External styles typically originate from the `ɵɵExternalStylesFeature` of a rendered component.\n     */\n    external = new Map();\n    /**\n     * Set of host DOM nodes that will have styles attached.\n     */\n    hosts = new Set();\n    /**\n     * Whether the application code is currently executing on a server.\n     */\n    isServer;\n    constructor(doc, appId, nonce, platformId = {}) {\n      this.doc = doc;\n      this.appId = appId;\n      this.nonce = nonce;\n      this.isServer = isPlatformServer(platformId);\n      addServerStyles(doc, appId, this.inline, this.external);\n      this.hosts.add(doc.head);\n    }\n    /**\n     * Adds embedded styles to the DOM via HTML `style` elements.\n     * @param styles An array of style content strings.\n     */\n    addStyles(styles, urls) {\n      for (const value of styles) {\n        this.addUsage(value, this.inline, createStyleElement);\n      }\n      urls?.forEach(value => this.addUsage(value, this.external, createLinkElement));\n    }\n    /**\n     * Removes embedded styles from the DOM that were added as HTML `style` elements.\n     * @param styles An array of style content strings.\n     */\n    removeStyles(styles, urls) {\n      for (const value of styles) {\n        this.removeUsage(value, this.inline);\n      }\n      urls?.forEach(value => this.removeUsage(value, this.external));\n    }\n    addUsage(value, usages, creator) {\n      // Attempt to get any current usage of the value\n      const record = usages.get(value);\n      // If existing, just increment the usage count\n      if (record) {\n        if ((typeof ngDevMode === 'undefined' || ngDevMode) && record.usage === 0) {\n          // A usage count of zero indicates a preexisting server generated style.\n          // This attribute is solely used for debugging purposes of SSR style reuse.\n          record.elements.forEach(element => element.setAttribute('ng-style-reused', ''));\n        }\n        record.usage++;\n      } else {\n        // Otherwise, create an entry to track the elements and add element for each host\n        usages.set(value, {\n          usage: 1,\n          elements: [...this.hosts].map(host => this.addElement(host, creator(value, this.doc)))\n        });\n      }\n    }\n    removeUsage(value, usages) {\n      // Attempt to get any current usage of the value\n      const record = usages.get(value);\n      // If there is a record, reduce the usage count and if no longer used,\n      // remove from DOM and delete usage record.\n      if (record) {\n        record.usage--;\n        if (record.usage <= 0) {\n          removeElements(record.elements);\n          usages.delete(value);\n        }\n      }\n    }\n    ngOnDestroy() {\n      for (const [, {\n        elements\n      }] of [...this.inline, ...this.external]) {\n        removeElements(elements);\n      }\n      this.hosts.clear();\n    }\n    /**\n     * Adds a host node to the set of style hosts and adds all existing style usage to\n     * the newly added host node.\n     *\n     * This is currently only used for Shadow DOM encapsulation mode.\n     */\n    addHost(hostNode) {\n      this.hosts.add(hostNode);\n      // Add existing styles to new host\n      for (const [style, {\n        elements\n      }] of this.inline) {\n        elements.push(this.addElement(hostNode, createStyleElement(style, this.doc)));\n      }\n      for (const [url, {\n        elements\n      }] of this.external) {\n        elements.push(this.addElement(hostNode, createLinkElement(url, this.doc)));\n      }\n    }\n    removeHost(hostNode) {\n      this.hosts.delete(hostNode);\n    }\n    addElement(host, element) {\n      // Add a nonce if present\n      if (this.nonce) {\n        element.setAttribute('nonce', this.nonce);\n      }\n      // Add application identifier when on the server to support client-side reuse\n      if (this.isServer) {\n        element.setAttribute(APP_ID_ATTRIBUTE_NAME, this.appId);\n      }\n      // Insert the element into the DOM with the host node as parent\n      return host.appendChild(element);\n    }\n    static ɵfac = function SharedStylesHost_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || SharedStylesHost)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(APP_ID), i0.ɵɵinject(CSP_NONCE, 8), i0.ɵɵinject(PLATFORM_ID));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: SharedStylesHost,\n      factory: SharedStylesHost.ɵfac\n    });\n  }\n  return SharedStylesHost;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst NAMESPACE_URIS = {\n  'svg': 'http://www.w3.org/2000/svg',\n  'xhtml': 'http://www.w3.org/1999/xhtml',\n  'xlink': 'http://www.w3.org/1999/xlink',\n  'xml': 'http://www.w3.org/XML/1998/namespace',\n  'xmlns': 'http://www.w3.org/2000/xmlns/',\n  'math': 'http://www.w3.org/1998/Math/MathML'\n};\nconst COMPONENT_REGEX = /%COMP%/g;\nconst COMPONENT_VARIABLE = '%COMP%';\nconst HOST_ATTR = `_nghost-${COMPONENT_VARIABLE}`;\nconst CONTENT_ATTR = `_ngcontent-${COMPONENT_VARIABLE}`;\n/**\n * The default value for the `REMOVE_STYLES_ON_COMPONENT_DESTROY` DI token.\n */\nconst REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT = true;\n/**\n * A DI token that indicates whether styles\n * of destroyed components should be removed from DOM.\n *\n * By default, the value is set to `true`.\n * @publicApi\n */\nconst REMOVE_STYLES_ON_COMPONENT_DESTROY = /*#__PURE__*/new InjectionToken(ngDevMode ? 'RemoveStylesOnCompDestroy' : '', {\n  providedIn: 'root',\n  factory: () => REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT\n});\nfunction shimContentAttribute(componentShortId) {\n  return CONTENT_ATTR.replace(COMPONENT_REGEX, componentShortId);\n}\nfunction shimHostAttribute(componentShortId) {\n  return HOST_ATTR.replace(COMPONENT_REGEX, componentShortId);\n}\nfunction shimStylesContent(compId, styles) {\n  return styles.map(s => s.replace(COMPONENT_REGEX, compId));\n}\nlet DomRendererFactory2 = /*#__PURE__*/(() => {\n  class DomRendererFactory2 {\n    eventManager;\n    sharedStylesHost;\n    appId;\n    removeStylesOnCompDestroy;\n    doc;\n    platformId;\n    ngZone;\n    nonce;\n    tracingService;\n    rendererByCompId = new Map();\n    defaultRenderer;\n    platformIsServer;\n    constructor(eventManager, sharedStylesHost, appId, removeStylesOnCompDestroy, doc, platformId, ngZone, nonce = null, tracingService = null) {\n      this.eventManager = eventManager;\n      this.sharedStylesHost = sharedStylesHost;\n      this.appId = appId;\n      this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;\n      this.doc = doc;\n      this.platformId = platformId;\n      this.ngZone = ngZone;\n      this.nonce = nonce;\n      this.tracingService = tracingService;\n      this.platformIsServer = isPlatformServer(platformId);\n      this.defaultRenderer = new DefaultDomRenderer2(eventManager, doc, ngZone, this.platformIsServer, this.tracingService);\n    }\n    createRenderer(element, type) {\n      if (!element || !type) {\n        return this.defaultRenderer;\n      }\n      if (this.platformIsServer && type.encapsulation === ViewEncapsulation.ShadowDom) {\n        // Domino does not support shadow DOM.\n        type = {\n          ...type,\n          encapsulation: ViewEncapsulation.Emulated\n        };\n      }\n      const renderer = this.getOrCreateRenderer(element, type);\n      // Renderers have different logic due to different encapsulation behaviours.\n      // Ex: for emulated, an attribute is added to the element.\n      if (renderer instanceof EmulatedEncapsulationDomRenderer2) {\n        renderer.applyToHost(element);\n      } else if (renderer instanceof NoneEncapsulationDomRenderer) {\n        renderer.applyStyles();\n      }\n      return renderer;\n    }\n    getOrCreateRenderer(element, type) {\n      const rendererByCompId = this.rendererByCompId;\n      let renderer = rendererByCompId.get(type.id);\n      if (!renderer) {\n        const doc = this.doc;\n        const ngZone = this.ngZone;\n        const eventManager = this.eventManager;\n        const sharedStylesHost = this.sharedStylesHost;\n        const removeStylesOnCompDestroy = this.removeStylesOnCompDestroy;\n        const platformIsServer = this.platformIsServer;\n        switch (type.encapsulation) {\n          case ViewEncapsulation.Emulated:\n            renderer = new EmulatedEncapsulationDomRenderer2(eventManager, sharedStylesHost, type, this.appId, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, this.tracingService);\n            break;\n          case ViewEncapsulation.ShadowDom:\n            return new ShadowDomRenderer(eventManager, sharedStylesHost, element, type, doc, ngZone, this.nonce, platformIsServer, this.tracingService);\n          default:\n            renderer = new NoneEncapsulationDomRenderer(eventManager, sharedStylesHost, type, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, this.tracingService);\n            break;\n        }\n        rendererByCompId.set(type.id, renderer);\n      }\n      return renderer;\n    }\n    ngOnDestroy() {\n      this.rendererByCompId.clear();\n    }\n    /**\n     * Used during HMR to clear any cached data about a component.\n     * @param componentId ID of the component that is being replaced.\n     */\n    componentReplaced(componentId) {\n      this.rendererByCompId.delete(componentId);\n    }\n    static ɵfac = function DomRendererFactory2_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || DomRendererFactory2)(i0.ɵɵinject(EventManager), i0.ɵɵinject(SharedStylesHost), i0.ɵɵinject(APP_ID), i0.ɵɵinject(REMOVE_STYLES_ON_COMPONENT_DESTROY), i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(PLATFORM_ID), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(CSP_NONCE), i0.ɵɵinject(ɵTracingService, 8));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: DomRendererFactory2,\n      factory: DomRendererFactory2.ɵfac\n    });\n  }\n  return DomRendererFactory2;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nclass DefaultDomRenderer2 {\n  eventManager;\n  doc;\n  ngZone;\n  platformIsServer;\n  tracingService;\n  data = /*#__PURE__*/Object.create(null);\n  /**\n   * By default this renderer throws when encountering synthetic properties\n   * This can be disabled for example by the AsyncAnimationRendererFactory\n   */\n  throwOnSyntheticProps = true;\n  constructor(eventManager, doc, ngZone, platformIsServer, tracingService) {\n    this.eventManager = eventManager;\n    this.doc = doc;\n    this.ngZone = ngZone;\n    this.platformIsServer = platformIsServer;\n    this.tracingService = tracingService;\n  }\n  destroy() {}\n  destroyNode = null;\n  createElement(name, namespace) {\n    if (namespace) {\n      // TODO: `|| namespace` was added in\n      // https://github.com/angular/angular/commit/2b9cc8503d48173492c29f5a271b61126104fbdb to\n      // support how Ivy passed around the namespace URI rather than short name at the time. It did\n      // not, however extend the support to other parts of the system (setAttribute, setAttribute,\n      // and the ServerRenderer). We should decide what exactly the semantics for dealing with\n      // namespaces should be and make it consistent.\n      // Related issues:\n      // https://github.com/angular/angular/issues/44028\n      // https://github.com/angular/angular/issues/44883\n      return this.doc.createElementNS(NAMESPACE_URIS[namespace] || namespace, name);\n    }\n    return this.doc.createElement(name);\n  }\n  createComment(value) {\n    return this.doc.createComment(value);\n  }\n  createText(value) {\n    return this.doc.createTextNode(value);\n  }\n  appendChild(parent, newChild) {\n    const targetParent = isTemplateNode(parent) ? parent.content : parent;\n    targetParent.appendChild(newChild);\n  }\n  insertBefore(parent, newChild, refChild) {\n    if (parent) {\n      const targetParent = isTemplateNode(parent) ? parent.content : parent;\n      targetParent.insertBefore(newChild, refChild);\n    }\n  }\n  removeChild(_parent, oldChild) {\n    oldChild.remove();\n  }\n  selectRootElement(selectorOrNode, preserveContent) {\n    let el = typeof selectorOrNode === 'string' ? this.doc.querySelector(selectorOrNode) : selectorOrNode;\n    if (!el) {\n      throw new ɵRuntimeError(-5104 /* RuntimeErrorCode.ROOT_NODE_NOT_FOUND */, (typeof ngDevMode === 'undefined' || ngDevMode) && `The selector \"${selectorOrNode}\" did not match any elements`);\n    }\n    if (!preserveContent) {\n      el.textContent = '';\n    }\n    return el;\n  }\n  parentNode(node) {\n    return node.parentNode;\n  }\n  nextSibling(node) {\n    return node.nextSibling;\n  }\n  setAttribute(el, name, value, namespace) {\n    if (namespace) {\n      name = namespace + ':' + name;\n      const namespaceUri = NAMESPACE_URIS[namespace];\n      if (namespaceUri) {\n        el.setAttributeNS(namespaceUri, name, value);\n      } else {\n        el.setAttribute(name, value);\n      }\n    } else {\n      el.setAttribute(name, value);\n    }\n  }\n  removeAttribute(el, name, namespace) {\n    if (namespace) {\n      const namespaceUri = NAMESPACE_URIS[namespace];\n      if (namespaceUri) {\n        el.removeAttributeNS(namespaceUri, name);\n      } else {\n        el.removeAttribute(`${namespace}:${name}`);\n      }\n    } else {\n      el.removeAttribute(name);\n    }\n  }\n  addClass(el, name) {\n    el.classList.add(name);\n  }\n  removeClass(el, name) {\n    el.classList.remove(name);\n  }\n  setStyle(el, style, value, flags) {\n    if (flags & (RendererStyleFlags2.DashCase | RendererStyleFlags2.Important)) {\n      el.style.setProperty(style, value, flags & RendererStyleFlags2.Important ? 'important' : '');\n    } else {\n      el.style[style] = value;\n    }\n  }\n  removeStyle(el, style, flags) {\n    if (flags & RendererStyleFlags2.DashCase) {\n      // removeProperty has no effect when used on camelCased properties.\n      el.style.removeProperty(style);\n    } else {\n      el.style[style] = '';\n    }\n  }\n  setProperty(el, name, value) {\n    if (el == null) {\n      return;\n    }\n    (typeof ngDevMode === 'undefined' || ngDevMode) && this.throwOnSyntheticProps && checkNoSyntheticProp(name, 'property');\n    el[name] = value;\n  }\n  setValue(node, value) {\n    node.nodeValue = value;\n  }\n  listen(target, event, callback, options) {\n    (typeof ngDevMode === 'undefined' || ngDevMode) && this.throwOnSyntheticProps && checkNoSyntheticProp(event, 'listener');\n    if (typeof target === 'string') {\n      target = ɵgetDOM().getGlobalEventTarget(this.doc, target);\n      if (!target) {\n        throw new Error(`Unsupported event target ${target} for event ${event}`);\n      }\n    }\n    let wrappedCallback = this.decoratePreventDefault(callback);\n    if (this.tracingService !== null && this.tracingService.wrapEventListener) {\n      wrappedCallback = this.tracingService.wrapEventListener(target, event, wrappedCallback);\n    }\n    return this.eventManager.addEventListener(target, event, wrappedCallback, options);\n  }\n  decoratePreventDefault(eventHandler) {\n    // `DebugNode.triggerEventHandler` needs to know if the listener was created with\n    // decoratePreventDefault or is a listener added outside the Angular context so it can handle\n    // the two differently. In the first case, the special '__ngUnwrap__' token is passed to the\n    // unwrap the listener (see below).\n    return event => {\n      // Ivy uses '__ngUnwrap__' as a special token that allows us to unwrap the function\n      // so that it can be invoked programmatically by `DebugNode.triggerEventHandler`. The\n      // debug_node can inspect the listener toString contents for the existence of this special\n      // token. Because the token is a string literal, it is ensured to not be modified by compiled\n      // code.\n      if (event === '__ngUnwrap__') {\n        return eventHandler;\n      }\n      // Run the event handler inside the ngZone because event handlers are not patched\n      // by Zone on the server. This is required only for tests.\n      const allowDefaultBehavior = this.platformIsServer ? this.ngZone.runGuarded(() => eventHandler(event)) : eventHandler(event);\n      if (allowDefaultBehavior === false) {\n        event.preventDefault();\n      }\n      return undefined;\n    };\n  }\n}\nconst AT_CHARCODE = /*#__PURE__*/(() => '@'.charCodeAt(0))();\nfunction checkNoSyntheticProp(name, nameKind) {\n  if (name.charCodeAt(0) === AT_CHARCODE) {\n    throw new ɵRuntimeError(5105 /* RuntimeErrorCode.UNEXPECTED_SYNTHETIC_PROPERTY */, `Unexpected synthetic ${nameKind} ${name} found. Please make sure that:\n  - Make sure \\`provideAnimationsAsync()\\`, \\`provideAnimations()\\` or \\`provideNoopAnimations()\\` call was added to a list of providers used to bootstrap an application.\n  - There is a corresponding animation configuration named \\`${name}\\` defined in the \\`animations\\` field of the \\`@Component\\` decorator (see https://angular.dev/api/core/Component#animations).`);\n  }\n}\nfunction isTemplateNode(node) {\n  return node.tagName === 'TEMPLATE' && node.content !== undefined;\n}\nclass ShadowDomRenderer extends DefaultDomRenderer2 {\n  sharedStylesHost;\n  hostEl;\n  shadowRoot;\n  constructor(eventManager, sharedStylesHost, hostEl, component, doc, ngZone, nonce, platformIsServer, tracingService) {\n    super(eventManager, doc, ngZone, platformIsServer, tracingService);\n    this.sharedStylesHost = sharedStylesHost;\n    this.hostEl = hostEl;\n    this.shadowRoot = hostEl.attachShadow({\n      mode: 'open'\n    });\n    this.sharedStylesHost.addHost(this.shadowRoot);\n    const styles = shimStylesContent(component.id, component.styles);\n    for (const style of styles) {\n      const styleEl = document.createElement('style');\n      if (nonce) {\n        styleEl.setAttribute('nonce', nonce);\n      }\n      styleEl.textContent = style;\n      this.shadowRoot.appendChild(styleEl);\n    }\n    // Apply any external component styles to the shadow root for the component's element.\n    // The ShadowDOM renderer uses an alternative execution path for component styles that\n    // does not use the SharedStylesHost that other encapsulation modes leverage. Much like\n    // the manual addition of embedded styles directly above, any external stylesheets\n    // must be manually added here to ensure ShadowDOM components are correctly styled.\n    // TODO: Consider reworking the DOM Renderers to consolidate style handling.\n    const styleUrls = component.getExternalStyles?.();\n    if (styleUrls) {\n      for (const styleUrl of styleUrls) {\n        const linkEl = createLinkElement(styleUrl, doc);\n        if (nonce) {\n          linkEl.setAttribute('nonce', nonce);\n        }\n        this.shadowRoot.appendChild(linkEl);\n      }\n    }\n  }\n  nodeOrShadowRoot(node) {\n    return node === this.hostEl ? this.shadowRoot : node;\n  }\n  appendChild(parent, newChild) {\n    return super.appendChild(this.nodeOrShadowRoot(parent), newChild);\n  }\n  insertBefore(parent, newChild, refChild) {\n    return super.insertBefore(this.nodeOrShadowRoot(parent), newChild, refChild);\n  }\n  removeChild(_parent, oldChild) {\n    return super.removeChild(null, oldChild);\n  }\n  parentNode(node) {\n    return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(node)));\n  }\n  destroy() {\n    this.sharedStylesHost.removeHost(this.shadowRoot);\n  }\n}\nclass NoneEncapsulationDomRenderer extends DefaultDomRenderer2 {\n  sharedStylesHost;\n  removeStylesOnCompDestroy;\n  styles;\n  styleUrls;\n  constructor(eventManager, sharedStylesHost, component, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService, compId) {\n    super(eventManager, doc, ngZone, platformIsServer, tracingService);\n    this.sharedStylesHost = sharedStylesHost;\n    this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;\n    this.styles = compId ? shimStylesContent(compId, component.styles) : component.styles;\n    this.styleUrls = component.getExternalStyles?.(compId);\n  }\n  applyStyles() {\n    this.sharedStylesHost.addStyles(this.styles, this.styleUrls);\n  }\n  destroy() {\n    if (!this.removeStylesOnCompDestroy) {\n      return;\n    }\n    this.sharedStylesHost.removeStyles(this.styles, this.styleUrls);\n  }\n}\nclass EmulatedEncapsulationDomRenderer2 extends NoneEncapsulationDomRenderer {\n  contentAttr;\n  hostAttr;\n  constructor(eventManager, sharedStylesHost, component, appId, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService) {\n    const compId = appId + '-' + component.id;\n    super(eventManager, sharedStylesHost, component, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService, compId);\n    this.contentAttr = shimContentAttribute(compId);\n    this.hostAttr = shimHostAttribute(compId);\n  }\n  applyToHost(element) {\n    this.applyStyles();\n    this.setAttribute(element, this.hostAttr, '');\n  }\n  createElement(parent, name) {\n    const el = super.createElement(parent, name);\n    super.setAttribute(el, this.contentAttr, '');\n    return el;\n  }\n}\nlet DomEventsPlugin = /*#__PURE__*/(() => {\n  class DomEventsPlugin extends EventManagerPlugin {\n    constructor(doc) {\n      super(doc);\n    }\n    // This plugin should come last in the list of plugins, because it accepts all\n    // events.\n    supports(eventName) {\n      return true;\n    }\n    addEventListener(element, eventName, handler, options) {\n      element.addEventListener(eventName, handler, options);\n      return () => this.removeEventListener(element, eventName, handler, options);\n    }\n    removeEventListener(target, eventName, callback, options) {\n      return target.removeEventListener(eventName, callback, options);\n    }\n    static ɵfac = function DomEventsPlugin_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || DomEventsPlugin)(i0.ɵɵinject(DOCUMENT));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: DomEventsPlugin,\n      factory: DomEventsPlugin.ɵfac\n    });\n  }\n  return DomEventsPlugin;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Defines supported modifiers for key events.\n */\nconst MODIFIER_KEYS = ['alt', 'control', 'meta', 'shift'];\n// The following values are here for cross-browser compatibility and to match the W3C standard\n// cf https://www.w3.org/TR/DOM-Level-3-Events-key/\nconst _keyMap = {\n  '\\b': 'Backspace',\n  '\\t': 'Tab',\n  '\\x7F': 'Delete',\n  '\\x1B': 'Escape',\n  'Del': 'Delete',\n  'Esc': 'Escape',\n  'Left': 'ArrowLeft',\n  'Right': 'ArrowRight',\n  'Up': 'ArrowUp',\n  'Down': 'ArrowDown',\n  'Menu': 'ContextMenu',\n  'Scroll': 'ScrollLock',\n  'Win': 'OS'\n};\n/**\n * Retrieves modifiers from key-event objects.\n */\nconst MODIFIER_KEY_GETTERS = {\n  'alt': event => event.altKey,\n  'control': event => event.ctrlKey,\n  'meta': event => event.metaKey,\n  'shift': event => event.shiftKey\n};\n/**\n * A browser plug-in that provides support for handling of key events in Angular.\n */\nlet KeyEventsPlugin = /*#__PURE__*/(() => {\n  class KeyEventsPlugin extends EventManagerPlugin {\n    /**\n     * Initializes an instance of the browser plug-in.\n     * @param doc The document in which key events will be detected.\n     */\n    constructor(doc) {\n      super(doc);\n    }\n    /**\n     * Reports whether a named key event is supported.\n     * @param eventName The event name to query.\n     * @return True if the named key event is supported.\n     */\n    supports(eventName) {\n      return KeyEventsPlugin.parseEventName(eventName) != null;\n    }\n    /**\n     * Registers a handler for a specific element and key event.\n     * @param element The HTML element to receive event notifications.\n     * @param eventName The name of the key event to listen for.\n     * @param handler A function to call when the notification occurs. Receives the\n     * event object as an argument.\n     * @returns The key event that was registered.\n     */\n    addEventListener(element, eventName, handler, options) {\n      const parsedEvent = KeyEventsPlugin.parseEventName(eventName);\n      const outsideHandler = KeyEventsPlugin.eventCallback(parsedEvent['fullKey'], handler, this.manager.getZone());\n      return this.manager.getZone().runOutsideAngular(() => {\n        return ɵgetDOM().onAndCancel(element, parsedEvent['domEventName'], outsideHandler, options);\n      });\n    }\n    /**\n     * Parses the user provided full keyboard event definition and normalizes it for\n     * later internal use. It ensures the string is all lowercase, converts special\n     * characters to a standard spelling, and orders all the values consistently.\n     *\n     * @param eventName The name of the key event to listen for.\n     * @returns an object with the full, normalized string, and the dom event name\n     * or null in the case when the event doesn't match a keyboard event.\n     */\n    static parseEventName(eventName) {\n      const parts = eventName.toLowerCase().split('.');\n      const domEventName = parts.shift();\n      if (parts.length === 0 || !(domEventName === 'keydown' || domEventName === 'keyup')) {\n        return null;\n      }\n      const key = KeyEventsPlugin._normalizeKey(parts.pop());\n      let fullKey = '';\n      let codeIX = parts.indexOf('code');\n      if (codeIX > -1) {\n        parts.splice(codeIX, 1);\n        fullKey = 'code.';\n      }\n      MODIFIER_KEYS.forEach(modifierName => {\n        const index = parts.indexOf(modifierName);\n        if (index > -1) {\n          parts.splice(index, 1);\n          fullKey += modifierName + '.';\n        }\n      });\n      fullKey += key;\n      if (parts.length != 0 || key.length === 0) {\n        // returning null instead of throwing to let another plugin process the event\n        return null;\n      }\n      // NOTE: Please don't rewrite this as so, as it will break JSCompiler property renaming.\n      //       The code must remain in the `result['domEventName']` form.\n      // return {domEventName, fullKey};\n      const result = {};\n      result['domEventName'] = domEventName;\n      result['fullKey'] = fullKey;\n      return result;\n    }\n    /**\n     * Determines whether the actual keys pressed match the configured key code string.\n     * The `fullKeyCode` event is normalized in the `parseEventName` method when the\n     * event is attached to the DOM during the `addEventListener` call. This is unseen\n     * by the end user and is normalized for internal consistency and parsing.\n     *\n     * @param event The keyboard event.\n     * @param fullKeyCode The normalized user defined expected key event string\n     * @returns boolean.\n     */\n    static matchEventFullKeyCode(event, fullKeyCode) {\n      let keycode = _keyMap[event.key] || event.key;\n      let key = '';\n      if (fullKeyCode.indexOf('code.') > -1) {\n        keycode = event.code;\n        key = 'code.';\n      }\n      // the keycode could be unidentified so we have to check here\n      if (keycode == null || !keycode) return false;\n      keycode = keycode.toLowerCase();\n      if (keycode === ' ') {\n        keycode = 'space'; // for readability\n      } else if (keycode === '.') {\n        keycode = 'dot'; // because '.' is used as a separator in event names\n      }\n      MODIFIER_KEYS.forEach(modifierName => {\n        if (modifierName !== keycode) {\n          const modifierGetter = MODIFIER_KEY_GETTERS[modifierName];\n          if (modifierGetter(event)) {\n            key += modifierName + '.';\n          }\n        }\n      });\n      key += keycode;\n      return key === fullKeyCode;\n    }\n    /**\n     * Configures a handler callback for a key event.\n     * @param fullKey The event name that combines all simultaneous keystrokes.\n     * @param handler The function that responds to the key event.\n     * @param zone The zone in which the event occurred.\n     * @returns A callback function.\n     */\n    static eventCallback(fullKey, handler, zone) {\n      return event => {\n        if (KeyEventsPlugin.matchEventFullKeyCode(event, fullKey)) {\n          zone.runGuarded(() => handler(event));\n        }\n      };\n    }\n    /** @internal */\n    static _normalizeKey(keyName) {\n      return keyName === 'esc' ? 'escape' : keyName;\n    }\n    static ɵfac = function KeyEventsPlugin_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || KeyEventsPlugin)(i0.ɵɵinject(DOCUMENT));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: KeyEventsPlugin,\n      factory: KeyEventsPlugin.ɵfac\n    });\n  }\n  return KeyEventsPlugin;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Bootstraps an instance of an Angular application and renders a standalone component as the\n * application's root component. More information about standalone components can be found in [this\n * guide](guide/components/importing).\n *\n * @usageNotes\n * The root component passed into this function *must* be a standalone one (should have the\n * `standalone: true` flag in the `@Component` decorator config).\n *\n * ```angular-ts\n * @Component({\n *   standalone: true,\n *   template: 'Hello world!'\n * })\n * class RootComponent {}\n *\n * const appRef: ApplicationRef = await bootstrapApplication(RootComponent);\n * ```\n *\n * You can add the list of providers that should be available in the application injector by\n * specifying the `providers` field in an object passed as the second argument:\n *\n * ```ts\n * await bootstrapApplication(RootComponent, {\n *   providers: [\n *     {provide: BACKEND_URL, useValue: 'https://yourdomain.com/api'}\n *   ]\n * });\n * ```\n *\n * The `importProvidersFrom` helper method can be used to collect all providers from any\n * existing NgModule (and transitively from all NgModules that it imports):\n *\n * ```ts\n * await bootstrapApplication(RootComponent, {\n *   providers: [\n *     importProvidersFrom(SomeNgModule)\n *   ]\n * });\n * ```\n *\n * Note: the `bootstrapApplication` method doesn't include [Testability](api/core/Testability) by\n * default. You can add [Testability](api/core/Testability) by getting the list of necessary\n * providers using `provideProtractorTestingSupport()` function and adding them into the `providers`\n * array, for example:\n *\n * ```ts\n * import {provideProtractorTestingSupport} from '@angular/platform-browser';\n *\n * await bootstrapApplication(RootComponent, {providers: [provideProtractorTestingSupport()]});\n * ```\n *\n * @param rootComponent A reference to a standalone component that should be rendered.\n * @param options Extra configuration for the bootstrap operation, see `ApplicationConfig` for\n *     additional info.\n * @returns A promise that returns an `ApplicationRef` instance once resolved.\n *\n * @publicApi\n */\nfunction bootstrapApplication(rootComponent, options) {\n  return ɵinternalCreateApplication({\n    rootComponent,\n    ...createProvidersConfig(options)\n  });\n}\n/**\n * Create an instance of an Angular application without bootstrapping any components. This is useful\n * for the situation where one wants to decouple application environment creation (a platform and\n * associated injectors) from rendering components on a screen. Components can be subsequently\n * bootstrapped on the returned `ApplicationRef`.\n *\n * @param options Extra configuration for the application environment, see `ApplicationConfig` for\n *     additional info.\n * @returns A promise that returns an `ApplicationRef` instance once resolved.\n *\n * @publicApi\n */\nfunction createApplication(options) {\n  return ɵinternalCreateApplication(createProvidersConfig(options));\n}\nfunction createProvidersConfig(options) {\n  return {\n    appProviders: [...BROWSER_MODULE_PROVIDERS, ...(options?.providers ?? [])],\n    platformProviders: INTERNAL_BROWSER_PLATFORM_PROVIDERS\n  };\n}\n/**\n * Returns a set of providers required to setup [Testability](api/core/Testability) for an\n * application bootstrapped using the `bootstrapApplication` function. The set of providers is\n * needed to support testing an application with Protractor (which relies on the Testability APIs\n * to be present).\n *\n * @returns An array of providers required to setup Testability for an application and make it\n *     available for testing using Protractor.\n *\n * @publicApi\n */\nfunction provideProtractorTestingSupport() {\n  // Return a copy to prevent changes to the original array in case any in-place\n  // alterations are performed to the `provideProtractorTestingSupport` call results in app\n  // code.\n  return [...TESTABILITY_PROVIDERS];\n}\nfunction initDomAdapter() {\n  BrowserDomAdapter.makeCurrent();\n}\nfunction errorHandler() {\n  return new ErrorHandler();\n}\nfunction _document() {\n  // Tell ivy about the global document\n  ɵsetDocument(document);\n  return document;\n}\nconst INTERNAL_BROWSER_PLATFORM_PROVIDERS = [{\n  provide: PLATFORM_ID,\n  useValue: ɵPLATFORM_BROWSER_ID\n}, {\n  provide: PLATFORM_INITIALIZER,\n  useValue: initDomAdapter,\n  multi: true\n}, {\n  provide: DOCUMENT,\n  useFactory: _document,\n  deps: []\n}];\n/**\n * A factory function that returns a `PlatformRef` instance associated with browser service\n * providers.\n *\n * @publicApi\n */\nconst platformBrowser = /*#__PURE__*/createPlatformFactory(platformCore, 'browser', INTERNAL_BROWSER_PLATFORM_PROVIDERS);\n/**\n * Internal marker to signal whether providers from the `BrowserModule` are already present in DI.\n * This is needed to avoid loading `BrowserModule` providers twice. We can't rely on the\n * `BrowserModule` presence itself, since the standalone-based bootstrap just imports\n * `BrowserModule` providers without referencing the module itself.\n */\nconst BROWSER_MODULE_PROVIDERS_MARKER = /*#__PURE__*/new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'BrowserModule Providers Marker' : '');\nconst TESTABILITY_PROVIDERS = [{\n  provide: ɵTESTABILITY_GETTER,\n  useClass: BrowserGetTestability,\n  deps: []\n}, {\n  provide: ɵTESTABILITY,\n  useClass: Testability,\n  deps: [NgZone, TestabilityRegistry, ɵTESTABILITY_GETTER]\n}, {\n  provide: Testability,\n  // Also provide as `Testability` for backwards-compatibility.\n  useClass: Testability,\n  deps: [NgZone, TestabilityRegistry, ɵTESTABILITY_GETTER]\n}];\nconst BROWSER_MODULE_PROVIDERS = [{\n  provide: ɵINJECTOR_SCOPE,\n  useValue: 'root'\n}, {\n  provide: ErrorHandler,\n  useFactory: errorHandler,\n  deps: []\n}, {\n  provide: EVENT_MANAGER_PLUGINS,\n  useClass: DomEventsPlugin,\n  multi: true,\n  deps: [DOCUMENT, NgZone, PLATFORM_ID]\n}, {\n  provide: EVENT_MANAGER_PLUGINS,\n  useClass: KeyEventsPlugin,\n  multi: true,\n  deps: [DOCUMENT]\n}, DomRendererFactory2, SharedStylesHost, EventManager, {\n  provide: RendererFactory2,\n  useExisting: DomRendererFactory2\n}, {\n  provide: XhrFactory,\n  useClass: BrowserXhr,\n  deps: []\n}, typeof ngDevMode === 'undefined' || ngDevMode ? {\n  provide: BROWSER_MODULE_PROVIDERS_MARKER,\n  useValue: true\n} : []];\n/**\n * Exports required infrastructure for all Angular apps.\n * Included by default in all Angular apps created with the CLI\n * `new` command.\n * Re-exports `CommonModule` and `ApplicationModule`, making their\n * exports and providers available to all apps.\n *\n * @publicApi\n */\nlet BrowserModule = /*#__PURE__*/(() => {\n  class BrowserModule {\n    constructor() {\n      if (typeof ngDevMode === 'undefined' || ngDevMode) {\n        const providersAlreadyPresent = inject(BROWSER_MODULE_PROVIDERS_MARKER, {\n          optional: true,\n          skipSelf: true\n        });\n        if (providersAlreadyPresent) {\n          throw new ɵRuntimeError(5100 /* RuntimeErrorCode.BROWSER_MODULE_ALREADY_LOADED */, `Providers from the \\`BrowserModule\\` have already been loaded. If you need access ` + `to common directives such as NgIf and NgFor, import the \\`CommonModule\\` instead.`);\n        }\n      }\n    }\n    static ɵfac = function BrowserModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || BrowserModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: BrowserModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],\n      imports: [CommonModule, ApplicationModule]\n    });\n  }\n  return BrowserModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * A service for managing HTML `<meta>` tags.\n *\n * Properties of the `MetaDefinition` object match the attributes of the\n * HTML `<meta>` tag. These tags define document metadata that is important for\n * things like configuring a Content Security Policy, defining browser compatibility\n * and security settings, setting HTTP Headers, defining rich content for social sharing,\n * and Search Engine Optimization (SEO).\n *\n * To identify specific `<meta>` tags in a document, use an attribute selection\n * string in the format `\"tag_attribute='value string'\"`.\n * For example, an `attrSelector` value of `\"name='description'\"` matches a tag\n * whose `name` attribute has the value `\"description\"`.\n * Selectors are used with the `querySelector()` Document method,\n * in the format `meta[{attrSelector}]`.\n *\n * @see [HTML meta tag](https://developer.mozilla.org/docs/Web/HTML/Element/meta)\n * @see [Document.querySelector()](https://developer.mozilla.org/docs/Web/API/Document/querySelector)\n *\n *\n * @publicApi\n */\nlet Meta = /*#__PURE__*/(() => {\n  class Meta {\n    _doc;\n    _dom;\n    constructor(_doc) {\n      this._doc = _doc;\n      this._dom = ɵgetDOM();\n    }\n    /**\n     * Retrieves or creates a specific `<meta>` tag element in the current HTML document.\n     * In searching for an existing tag, Angular attempts to match the `name` or `property` attribute\n     * values in the provided tag definition, and verifies that all other attribute values are equal.\n     * If an existing element is found, it is returned and is not modified in any way.\n     * @param tag The definition of a `<meta>` element to match or create.\n     * @param forceCreation True to create a new element without checking whether one already exists.\n     * @returns The existing element with the same attributes and values if found,\n     * the new element if no match is found, or `null` if the tag parameter is not defined.\n     */\n    addTag(tag, forceCreation = false) {\n      if (!tag) return null;\n      return this._getOrCreateElement(tag, forceCreation);\n    }\n    /**\n     * Retrieves or creates a set of `<meta>` tag elements in the current HTML document.\n     * In searching for an existing tag, Angular attempts to match the `name` or `property` attribute\n     * values in the provided tag definition, and verifies that all other attribute values are equal.\n     * @param tags An array of tag definitions to match or create.\n     * @param forceCreation True to create new elements without checking whether they already exist.\n     * @returns The matching elements if found, or the new elements.\n     */\n    addTags(tags, forceCreation = false) {\n      if (!tags) return [];\n      return tags.reduce((result, tag) => {\n        if (tag) {\n          result.push(this._getOrCreateElement(tag, forceCreation));\n        }\n        return result;\n      }, []);\n    }\n    /**\n     * Retrieves a `<meta>` tag element in the current HTML document.\n     * @param attrSelector The tag attribute and value to match against, in the format\n     * `\"tag_attribute='value string'\"`.\n     * @returns The matching element, if any.\n     */\n    getTag(attrSelector) {\n      if (!attrSelector) return null;\n      return this._doc.querySelector(`meta[${attrSelector}]`) || null;\n    }\n    /**\n     * Retrieves a set of `<meta>` tag elements in the current HTML document.\n     * @param attrSelector The tag attribute and value to match against, in the format\n     * `\"tag_attribute='value string'\"`.\n     * @returns The matching elements, if any.\n     */\n    getTags(attrSelector) {\n      if (!attrSelector) return [];\n      const list /*NodeList*/ = this._doc.querySelectorAll(`meta[${attrSelector}]`);\n      return list ? [].slice.call(list) : [];\n    }\n    /**\n     * Modifies an existing `<meta>` tag element in the current HTML document.\n     * @param tag The tag description with which to replace the existing tag content.\n     * @param selector A tag attribute and value to match against, to identify\n     * an existing tag. A string in the format `\"tag_attribute=`value string`\"`.\n     * If not supplied, matches a tag with the same `name` or `property` attribute value as the\n     * replacement tag.\n     * @return The modified element.\n     */\n    updateTag(tag, selector) {\n      if (!tag) return null;\n      selector = selector || this._parseSelector(tag);\n      const meta = this.getTag(selector);\n      if (meta) {\n        return this._setMetaElementAttributes(tag, meta);\n      }\n      return this._getOrCreateElement(tag, true);\n    }\n    /**\n     * Removes an existing `<meta>` tag element from the current HTML document.\n     * @param attrSelector A tag attribute and value to match against, to identify\n     * an existing tag. A string in the format `\"tag_attribute=`value string`\"`.\n     */\n    removeTag(attrSelector) {\n      this.removeTagElement(this.getTag(attrSelector));\n    }\n    /**\n     * Removes an existing `<meta>` tag element from the current HTML document.\n     * @param meta The tag definition to match against to identify an existing tag.\n     */\n    removeTagElement(meta) {\n      if (meta) {\n        this._dom.remove(meta);\n      }\n    }\n    _getOrCreateElement(meta, forceCreation = false) {\n      if (!forceCreation) {\n        const selector = this._parseSelector(meta);\n        // It's allowed to have multiple elements with the same name so it's not enough to\n        // just check that element with the same name already present on the page. We also need to\n        // check if element has tag attributes\n        const elem = this.getTags(selector).filter(elem => this._containsAttributes(meta, elem))[0];\n        if (elem !== undefined) return elem;\n      }\n      const element = this._dom.createElement('meta');\n      this._setMetaElementAttributes(meta, element);\n      const head = this._doc.getElementsByTagName('head')[0];\n      head.appendChild(element);\n      return element;\n    }\n    _setMetaElementAttributes(tag, el) {\n      Object.keys(tag).forEach(prop => el.setAttribute(this._getMetaKeyMap(prop), tag[prop]));\n      return el;\n    }\n    _parseSelector(tag) {\n      const attr = tag.name ? 'name' : 'property';\n      return `${attr}=\"${tag[attr]}\"`;\n    }\n    _containsAttributes(tag, elem) {\n      return Object.keys(tag).every(key => elem.getAttribute(this._getMetaKeyMap(key)) === tag[key]);\n    }\n    _getMetaKeyMap(prop) {\n      return META_KEYS_MAP[prop] || prop;\n    }\n    static ɵfac = function Meta_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || Meta)(i0.ɵɵinject(DOCUMENT));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: Meta,\n      factory: Meta.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return Meta;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Mapping for MetaDefinition properties with their correct meta attribute names\n */\nconst META_KEYS_MAP = {\n  httpEquiv: 'http-equiv'\n};\n\n/**\n * A service that can be used to get and set the title of a current HTML document.\n *\n * Since an Angular application can't be bootstrapped on the entire HTML document (`<html>` tag)\n * it is not possible to bind to the `text` property of the `HTMLTitleElement` elements\n * (representing the `<title>` tag). Instead, this service can be used to set and get the current\n * title value.\n *\n * @publicApi\n */\nlet Title = /*#__PURE__*/(() => {\n  class Title {\n    _doc;\n    constructor(_doc) {\n      this._doc = _doc;\n    }\n    /**\n     * Get the title of the current HTML document.\n     */\n    getTitle() {\n      return this._doc.title;\n    }\n    /**\n     * Set the title of the current HTML document.\n     * @param newTitle\n     */\n    setTitle(newTitle) {\n      this._doc.title = newTitle || '';\n    }\n    static ɵfac = function Title_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || Title)(i0.ɵɵinject(DOCUMENT));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: Title,\n      factory: Title.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return Title;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Exports the value under a given `name` in the global property `ng`. For example `ng.probe` if\n * `name` is `'probe'`.\n * @param name Name under which it will be exported. Keep in mind this will be a property of the\n * global `ng` object.\n * @param value The value to export.\n */\nfunction exportNgVar(name, value) {\n  if (typeof COMPILED === 'undefined' || !COMPILED) {\n    // Note: we can't export `ng` when using closure enhanced optimization as:\n    // - closure declares globals itself for minified names, which sometimes clobber our `ng` global\n    // - we can't declare a closure extern as the namespace `ng` is already used within Google\n    //   for typings for angularJS (via `goog.provide('ng....')`).\n    const ng = ɵglobal['ng'] = ɵglobal['ng'] || {};\n    ng[name] = value;\n  }\n}\nclass ChangeDetectionPerfRecord {\n  msPerTick;\n  numTicks;\n  constructor(msPerTick, numTicks) {\n    this.msPerTick = msPerTick;\n    this.numTicks = numTicks;\n  }\n}\n/**\n * Entry point for all Angular profiling-related debug tools. This object\n * corresponds to the `ng.profiler` in the dev console.\n */\nclass AngularProfiler {\n  appRef;\n  constructor(ref) {\n    this.appRef = ref.injector.get(ApplicationRef);\n  }\n  // tslint:disable:no-console\n  /**\n   * Exercises change detection in a loop and then prints the average amount of\n   * time in milliseconds how long a single round of change detection takes for\n   * the current state of the UI. It runs a minimum of 5 rounds for a minimum\n   * of 500 milliseconds.\n   *\n   * Optionally, a user may pass a `config` parameter containing a map of\n   * options. Supported options are:\n   *\n   * `record` (boolean) - causes the profiler to record a CPU profile while\n   * it exercises the change detector. Example:\n   *\n   * ```ts\n   * ng.profiler.timeChangeDetection({record: true})\n   * ```\n   */\n  timeChangeDetection(config) {\n    const record = config && config['record'];\n    const profileName = 'Change Detection';\n    // Profiler is not available in Android browsers without dev tools opened\n    if (record && 'profile' in console && typeof console.profile === 'function') {\n      console.profile(profileName);\n    }\n    const start = performance.now();\n    let numTicks = 0;\n    while (numTicks < 5 || performance.now() - start < 500) {\n      this.appRef.tick();\n      numTicks++;\n    }\n    const end = performance.now();\n    if (record && 'profileEnd' in console && typeof console.profileEnd === 'function') {\n      console.profileEnd(profileName);\n    }\n    const msPerTick = (end - start) / numTicks;\n    console.log(`ran ${numTicks} change detection cycles`);\n    console.log(`${msPerTick.toFixed(2)} ms per check`);\n    return new ChangeDetectionPerfRecord(msPerTick, numTicks);\n  }\n}\nconst PROFILER_GLOBAL_NAME = 'profiler';\n/**\n * Enabled Angular debug tools that are accessible via your browser's\n * developer console.\n *\n * Usage:\n *\n * 1. Open developer console (e.g. in Chrome Ctrl + Shift + j)\n * 1. Type `ng.` (usually the console will show auto-complete suggestion)\n * 1. Try the change detection profiler `ng.profiler.timeChangeDetection()`\n *    then hit Enter.\n *\n * @publicApi\n */\nfunction enableDebugTools(ref) {\n  exportNgVar(PROFILER_GLOBAL_NAME, new AngularProfiler(ref));\n  return ref;\n}\n/**\n * Disables Angular tools.\n *\n * @publicApi\n */\nfunction disableDebugTools() {\n  exportNgVar(PROFILER_GLOBAL_NAME, null);\n}\n\n/**\n * Predicates for use with {@link DebugElement}'s query functions.\n *\n * @publicApi\n */\nclass By {\n  /**\n   * Match all nodes.\n   *\n   * @usageNotes\n   * ### Example\n   *\n   * {@example platform-browser/dom/debug/ts/by/by.ts region='by_all'}\n   */\n  static all() {\n    return () => true;\n  }\n  /**\n   * Match elements by the given CSS selector.\n   *\n   * @usageNotes\n   * ### Example\n   *\n   * {@example platform-browser/dom/debug/ts/by/by.ts region='by_css'}\n   */\n  static css(selector) {\n    return debugElement => {\n      return debugElement.nativeElement != null ? elementMatches(debugElement.nativeElement, selector) : false;\n    };\n  }\n  /**\n   * Match nodes that have the given directive present.\n   *\n   * @usageNotes\n   * ### Example\n   *\n   * {@example platform-browser/dom/debug/ts/by/by.ts region='by_directive'}\n   */\n  static directive(type) {\n    return debugNode => debugNode.providerTokens.indexOf(type) !== -1;\n  }\n}\nfunction elementMatches(n, selector) {\n  if (ɵgetDOM().isElementNode(n)) {\n    return n.matches && n.matches(selector) || n.msMatchesSelector && n.msMatchesSelector(selector) || n.webkitMatchesSelector && n.webkitMatchesSelector(selector);\n  }\n  return false;\n}\n\n/**\n * Supported HammerJS recognizer event names.\n */\nconst EVENT_NAMES = {\n  // pan\n  'pan': true,\n  'panstart': true,\n  'panmove': true,\n  'panend': true,\n  'pancancel': true,\n  'panleft': true,\n  'panright': true,\n  'panup': true,\n  'pandown': true,\n  // pinch\n  'pinch': true,\n  'pinchstart': true,\n  'pinchmove': true,\n  'pinchend': true,\n  'pinchcancel': true,\n  'pinchin': true,\n  'pinchout': true,\n  // press\n  'press': true,\n  'pressup': true,\n  // rotate\n  'rotate': true,\n  'rotatestart': true,\n  'rotatemove': true,\n  'rotateend': true,\n  'rotatecancel': true,\n  // swipe\n  'swipe': true,\n  'swipeleft': true,\n  'swiperight': true,\n  'swipeup': true,\n  'swipedown': true,\n  // tap\n  'tap': true,\n  'doubletap': true\n};\n/**\n * DI token for providing [HammerJS](https://hammerjs.github.io/) support to Angular.\n * @see {@link HammerGestureConfig}\n *\n * @ngModule HammerModule\n * @publicApi\n */\nconst HAMMER_GESTURE_CONFIG = /*#__PURE__*/new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'HammerGestureConfig' : '');\n/**\n * Injection token used to provide a HammerLoader to Angular.\n *\n * @see {@link HammerLoader}\n *\n * @publicApi\n */\nconst HAMMER_LOADER = /*#__PURE__*/new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'HammerLoader' : '');\n/**\n * An injectable [HammerJS Manager](https://hammerjs.github.io/api/#hammermanager)\n * for gesture recognition. Configures specific event recognition.\n * @publicApi\n */\nlet HammerGestureConfig = /*#__PURE__*/(() => {\n  class HammerGestureConfig {\n    /**\n     * A set of supported event names for gestures to be used in Angular.\n     * Angular supports all built-in recognizers, as listed in\n     * [HammerJS documentation](https://hammerjs.github.io/).\n     */\n    events = [];\n    /**\n     * Maps gesture event names to a set of configuration options\n     * that specify overrides to the default values for specific properties.\n     *\n     * The key is a supported event name to be configured,\n     * and the options object contains a set of properties, with override values\n     * to be applied to the named recognizer event.\n     * For example, to disable recognition of the rotate event, specify\n     *  `{\"rotate\": {\"enable\": false}}`.\n     *\n     * Properties that are not present take the HammerJS default values.\n     * For information about which properties are supported for which events,\n     * and their allowed and default values, see\n     * [HammerJS documentation](https://hammerjs.github.io/).\n     *\n     */\n    overrides = {};\n    /**\n     * Properties whose default values can be overridden for a given event.\n     * Different sets of properties apply to different events.\n     * For information about which properties are supported for which events,\n     * and their allowed and default values, see\n     * [HammerJS documentation](https://hammerjs.github.io/).\n     */\n    options;\n    /**\n     * Creates a [HammerJS Manager](https://hammerjs.github.io/api/#hammermanager)\n     * and attaches it to a given HTML element.\n     * @param element The element that will recognize gestures.\n     * @returns A HammerJS event-manager object.\n     */\n    buildHammer(element) {\n      const mc = new Hammer(element, this.options);\n      mc.get('pinch').set({\n        enable: true\n      });\n      mc.get('rotate').set({\n        enable: true\n      });\n      for (const eventName in this.overrides) {\n        mc.get(eventName).set(this.overrides[eventName]);\n      }\n      return mc;\n    }\n    static ɵfac = function HammerGestureConfig_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || HammerGestureConfig)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: HammerGestureConfig,\n      factory: HammerGestureConfig.ɵfac\n    });\n  }\n  return HammerGestureConfig;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Event plugin that adds Hammer support to an application.\n *\n * @ngModule HammerModule\n */\nlet HammerGesturesPlugin = /*#__PURE__*/(() => {\n  class HammerGesturesPlugin extends EventManagerPlugin {\n    _config;\n    _injector;\n    loader;\n    _loaderPromise = null;\n    constructor(doc, _config, _injector, loader) {\n      super(doc);\n      this._config = _config;\n      this._injector = _injector;\n      this.loader = loader;\n    }\n    supports(eventName) {\n      if (!EVENT_NAMES.hasOwnProperty(eventName.toLowerCase()) && !this.isCustomEvent(eventName)) {\n        return false;\n      }\n      if (!window.Hammer && !this.loader) {\n        if (typeof ngDevMode === 'undefined' || ngDevMode) {\n          // Get a `Console` through an injector to tree-shake the\n          // class when it is unused in production.\n          const _console = this._injector.get(ɵConsole);\n          _console.warn(`The \"${eventName}\" event cannot be bound because Hammer.JS is not ` + `loaded and no custom loader has been specified.`);\n        }\n        return false;\n      }\n      return true;\n    }\n    addEventListener(element, eventName, handler) {\n      const zone = this.manager.getZone();\n      eventName = eventName.toLowerCase();\n      // If Hammer is not present but a loader is specified, we defer adding the event listener\n      // until Hammer is loaded.\n      if (!window.Hammer && this.loader) {\n        this._loaderPromise = this._loaderPromise || zone.runOutsideAngular(() => this.loader());\n        // This `addEventListener` method returns a function to remove the added listener.\n        // Until Hammer is loaded, the returned function needs to *cancel* the registration rather\n        // than remove anything.\n        let cancelRegistration = false;\n        let deregister = () => {\n          cancelRegistration = true;\n        };\n        zone.runOutsideAngular(() => this._loaderPromise.then(() => {\n          // If Hammer isn't actually loaded when the custom loader resolves, give up.\n          if (!window.Hammer) {\n            if (typeof ngDevMode === 'undefined' || ngDevMode) {\n              const _console = this._injector.get(ɵConsole);\n              _console.warn(`The custom HAMMER_LOADER completed, but Hammer.JS is not present.`);\n            }\n            deregister = () => {};\n            return;\n          }\n          if (!cancelRegistration) {\n            // Now that Hammer is loaded and the listener is being loaded for real,\n            // the deregistration function changes from canceling registration to\n            // removal.\n            deregister = this.addEventListener(element, eventName, handler);\n          }\n        }).catch(() => {\n          if (typeof ngDevMode === 'undefined' || ngDevMode) {\n            const _console = this._injector.get(ɵConsole);\n            _console.warn(`The \"${eventName}\" event cannot be bound because the custom ` + `Hammer.JS loader failed.`);\n          }\n          deregister = () => {};\n        }));\n        // Return a function that *executes* `deregister` (and not `deregister` itself) so that we\n        // can change the behavior of `deregister` once the listener is added. Using a closure in\n        // this way allows us to avoid any additional data structures to track listener removal.\n        return () => {\n          deregister();\n        };\n      }\n      return zone.runOutsideAngular(() => {\n        // Creating the manager bind events, must be done outside of angular\n        const mc = this._config.buildHammer(element);\n        const callback = function (eventObj) {\n          zone.runGuarded(function () {\n            handler(eventObj);\n          });\n        };\n        mc.on(eventName, callback);\n        return () => {\n          mc.off(eventName, callback);\n          // destroy mc to prevent memory leak\n          if (typeof mc.destroy === 'function') {\n            mc.destroy();\n          }\n        };\n      });\n    }\n    isCustomEvent(eventName) {\n      return this._config.events.indexOf(eventName) > -1;\n    }\n    static ɵfac = function HammerGesturesPlugin_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || HammerGesturesPlugin)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(HAMMER_GESTURE_CONFIG), i0.ɵɵinject(i0.Injector), i0.ɵɵinject(HAMMER_LOADER, 8));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: HammerGesturesPlugin,\n      factory: HammerGesturesPlugin.ɵfac\n    });\n  }\n  return HammerGesturesPlugin;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Adds support for HammerJS.\n *\n * Import this module at the root of your application so that Angular can work with\n * HammerJS to detect gesture events.\n *\n * Note that applications still need to include the HammerJS script itself. This module\n * simply sets up the coordination layer between HammerJS and Angular's `EventManager`.\n *\n * @publicApi\n */\nlet HammerModule = /*#__PURE__*/(() => {\n  class HammerModule {\n    static ɵfac = function HammerModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || HammerModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: HammerModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      providers: [{\n        provide: EVENT_MANAGER_PLUGINS,\n        useClass: HammerGesturesPlugin,\n        multi: true,\n        deps: [DOCUMENT, HAMMER_GESTURE_CONFIG, Injector, [new Optional(), HAMMER_LOADER]]\n      }, {\n        provide: HAMMER_GESTURE_CONFIG,\n        useClass: HammerGestureConfig,\n        deps: []\n      }]\n    });\n  }\n  return HammerModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * DomSanitizer helps preventing Cross Site Scripting Security bugs (XSS) by sanitizing\n * values to be safe to use in the different DOM contexts.\n *\n * For example, when binding a URL in an `<a [href]=\"someValue\">` hyperlink, `someValue` will be\n * sanitized so that an attacker cannot inject e.g. a `javascript:` URL that would execute code on\n * the website.\n *\n * In specific situations, it might be necessary to disable sanitization, for example if the\n * application genuinely needs to produce a `javascript:` style link with a dynamic value in it.\n * Users can bypass security by constructing a value with one of the `bypassSecurityTrust...`\n * methods, and then binding to that value from the template.\n *\n * These situations should be very rare, and extraordinary care must be taken to avoid creating a\n * Cross Site Scripting (XSS) security bug!\n *\n * When using `bypassSecurityTrust...`, make sure to call the method as early as possible and as\n * close as possible to the source of the value, to make it easy to verify no security bug is\n * created by its use.\n *\n * It is not required (and not recommended) to bypass security if the value is safe, e.g. a URL that\n * does not start with a suspicious protocol, or an HTML snippet that does not contain dangerous\n * code. The sanitizer leaves safe values intact.\n *\n * @security Calling any of the `bypassSecurityTrust...` APIs disables Angular's built-in\n * sanitization for the value passed in. Carefully check and audit all values and code paths going\n * into this call. Make sure any user data is appropriately escaped for this security context.\n * For more detail, see the [Security Guide](https://g.co/ng/security).\n *\n * @publicApi\n */\nlet DomSanitizer = /*#__PURE__*/(() => {\n  class DomSanitizer {\n    static ɵfac = function DomSanitizer_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || DomSanitizer)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: DomSanitizer,\n      factory: function DomSanitizer_Factory(__ngFactoryType__) {\n        let __ngConditionalFactory__ = null;\n        if (__ngFactoryType__) {\n          __ngConditionalFactory__ = new (__ngFactoryType__ || DomSanitizer)();\n        } else {\n          __ngConditionalFactory__ = i0.ɵɵinject(DomSanitizerImpl);\n        }\n        return __ngConditionalFactory__;\n      },\n      providedIn: 'root'\n    });\n  }\n  return DomSanitizer;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet DomSanitizerImpl = /*#__PURE__*/(() => {\n  class DomSanitizerImpl extends DomSanitizer {\n    _doc;\n    constructor(_doc) {\n      super();\n      this._doc = _doc;\n    }\n    sanitize(ctx, value) {\n      if (value == null) return null;\n      switch (ctx) {\n        case SecurityContext.NONE:\n          return value;\n        case SecurityContext.HTML:\n          if (ɵallowSanitizationBypassAndThrow(value, \"HTML\" /* BypassType.Html */)) {\n            return ɵunwrapSafeValue(value);\n          }\n          return ɵ_sanitizeHtml(this._doc, String(value)).toString();\n        case SecurityContext.STYLE:\n          if (ɵallowSanitizationBypassAndThrow(value, \"Style\" /* BypassType.Style */)) {\n            return ɵunwrapSafeValue(value);\n          }\n          return value;\n        case SecurityContext.SCRIPT:\n          if (ɵallowSanitizationBypassAndThrow(value, \"Script\" /* BypassType.Script */)) {\n            return ɵunwrapSafeValue(value);\n          }\n          throw new ɵRuntimeError(5200 /* RuntimeErrorCode.SANITIZATION_UNSAFE_SCRIPT */, (typeof ngDevMode === 'undefined' || ngDevMode) && 'unsafe value used in a script context');\n        case SecurityContext.URL:\n          if (ɵallowSanitizationBypassAndThrow(value, \"URL\" /* BypassType.Url */)) {\n            return ɵunwrapSafeValue(value);\n          }\n          return ɵ_sanitizeUrl(String(value));\n        case SecurityContext.RESOURCE_URL:\n          if (ɵallowSanitizationBypassAndThrow(value, \"ResourceURL\" /* BypassType.ResourceUrl */)) {\n            return ɵunwrapSafeValue(value);\n          }\n          throw new ɵRuntimeError(5201 /* RuntimeErrorCode.SANITIZATION_UNSAFE_RESOURCE_URL */, (typeof ngDevMode === 'undefined' || ngDevMode) && `unsafe value used in a resource URL context (see ${ɵXSS_SECURITY_URL})`);\n        default:\n          throw new ɵRuntimeError(5202 /* RuntimeErrorCode.SANITIZATION_UNEXPECTED_CTX */, (typeof ngDevMode === 'undefined' || ngDevMode) && `Unexpected SecurityContext ${ctx} (see ${ɵXSS_SECURITY_URL})`);\n      }\n    }\n    bypassSecurityTrustHtml(value) {\n      return ɵbypassSanitizationTrustHtml(value);\n    }\n    bypassSecurityTrustStyle(value) {\n      return ɵbypassSanitizationTrustStyle(value);\n    }\n    bypassSecurityTrustScript(value) {\n      return ɵbypassSanitizationTrustScript(value);\n    }\n    bypassSecurityTrustUrl(value) {\n      return ɵbypassSanitizationTrustUrl(value);\n    }\n    bypassSecurityTrustResourceUrl(value) {\n      return ɵbypassSanitizationTrustResourceUrl(value);\n    }\n    static ɵfac = function DomSanitizerImpl_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || DomSanitizerImpl)(i0.ɵɵinject(DOCUMENT));\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: DomSanitizerImpl,\n      factory: DomSanitizerImpl.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return DomSanitizerImpl;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * The list of features as an enum to uniquely type each `HydrationFeature`.\n * @see {@link HydrationFeature}\n *\n * @publicApi\n */\nvar HydrationFeatureKind = /*#__PURE__*/function (HydrationFeatureKind) {\n  HydrationFeatureKind[HydrationFeatureKind[\"NoHttpTransferCache\"] = 0] = \"NoHttpTransferCache\";\n  HydrationFeatureKind[HydrationFeatureKind[\"HttpTransferCacheOptions\"] = 1] = \"HttpTransferCacheOptions\";\n  HydrationFeatureKind[HydrationFeatureKind[\"I18nSupport\"] = 2] = \"I18nSupport\";\n  HydrationFeatureKind[HydrationFeatureKind[\"EventReplay\"] = 3] = \"EventReplay\";\n  HydrationFeatureKind[HydrationFeatureKind[\"IncrementalHydration\"] = 4] = \"IncrementalHydration\";\n  return HydrationFeatureKind;\n}(HydrationFeatureKind || {});\n/**\n * Helper function to create an object that represents a Hydration feature.\n */\nfunction hydrationFeature(ɵkind, ɵproviders = [], ɵoptions = {}) {\n  return {\n    ɵkind,\n    ɵproviders\n  };\n}\n/**\n * Disables HTTP transfer cache. Effectively causes HTTP requests to be performed twice: once on the\n * server and other one on the browser.\n *\n * @publicApi\n */\nfunction withNoHttpTransferCache() {\n  // This feature has no providers and acts as a flag that turns off\n  // HTTP transfer cache (which otherwise is turned on by default).\n  return hydrationFeature(HydrationFeatureKind.NoHttpTransferCache);\n}\n/**\n * The function accepts an object, which allows to configure cache parameters,\n * such as which headers should be included (no headers are included by default),\n * whether POST requests should be cached or a callback function to determine if a\n * particular request should be cached.\n *\n * @publicApi\n */\nfunction withHttpTransferCacheOptions(options) {\n  // This feature has no providers and acts as a flag to pass options to the HTTP transfer cache.\n  return hydrationFeature(HydrationFeatureKind.HttpTransferCacheOptions, ɵwithHttpTransferCache(options));\n}\n/**\n * Enables support for hydrating i18n blocks.\n *\n * @developerPreview\n * @publicApi\n */\nfunction withI18nSupport() {\n  return hydrationFeature(HydrationFeatureKind.I18nSupport, ɵwithI18nSupport());\n}\n/**\n * Enables support for replaying user events (e.g. `click`s) that happened on a page\n * before hydration logic has completed. Once an application is hydrated, all captured\n * events are replayed and relevant event listeners are executed.\n *\n * @usageNotes\n *\n * Basic example of how you can enable event replay in your application when\n * `bootstrapApplication` function is used:\n * ```ts\n * bootstrapApplication(AppComponent, {\n *   providers: [provideClientHydration(withEventReplay())]\n * });\n * ```\n * @publicApi\n * @see {@link provideClientHydration}\n */\nfunction withEventReplay() {\n  return hydrationFeature(HydrationFeatureKind.EventReplay, ɵwithEventReplay());\n}\n/**\n * Enables support for incremental hydration using the `hydrate` trigger syntax.\n *\n * @usageNotes\n *\n * Basic example of how you can enable incremental hydration in your application when\n * the `bootstrapApplication` function is used:\n * ```ts\n * bootstrapApplication(AppComponent, {\n *   providers: [provideClientHydration(withIncrementalHydration())]\n * });\n * ```\n * @experimental\n * @publicApi\n * @see {@link provideClientHydration}\n */\nfunction withIncrementalHydration() {\n  return hydrationFeature(HydrationFeatureKind.IncrementalHydration, ɵwithIncrementalHydration());\n}\n/**\n * Returns an `ENVIRONMENT_INITIALIZER` token setup with a function\n * that verifies whether compatible ZoneJS was used in an application\n * and logs a warning in a console if it's not the case.\n */\nfunction provideZoneJsCompatibilityDetector() {\n  return [{\n    provide: ENVIRONMENT_INITIALIZER,\n    useValue: () => {\n      const ngZone = inject(NgZone);\n      const isZoneless = inject(ɵZONELESS_ENABLED);\n      // Checking `ngZone instanceof NgZone` would be insufficient here,\n      // because custom implementations might use NgZone as a base class.\n      if (!isZoneless && ngZone.constructor !== NgZone) {\n        const console = inject(ɵConsole);\n        const message = ɵformatRuntimeError(-5000 /* RuntimeErrorCode.UNSUPPORTED_ZONEJS_INSTANCE */, 'Angular detected that hydration was enabled for an application ' + 'that uses a custom or a noop Zone.js implementation. ' + 'This is not yet a fully supported configuration.');\n        console.warn(message);\n      }\n    },\n    multi: true\n  }];\n}\n/**\n * Sets up providers necessary to enable hydration functionality for the application.\n *\n * By default, the function enables the recommended set of features for the optimal\n * performance for most of the applications. It includes the following features:\n *\n * * Reconciling DOM hydration. Learn more about it [here](guide/hydration).\n * * [`HttpClient`](api/common/http/HttpClient) response caching while running on the server and\n * transferring this cache to the client to avoid extra HTTP requests. Learn more about data caching\n * [here](guide/ssr#caching-data-when-using-httpclient).\n *\n * These functions allow you to disable some of the default features or enable new ones:\n *\n * * {@link withNoHttpTransferCache} to disable HTTP transfer cache\n * * {@link withHttpTransferCacheOptions} to configure some HTTP transfer cache options\n * * {@link withI18nSupport} to enable hydration support for i18n blocks\n * * {@link withEventReplay} to enable support for replaying user events\n *\n * @usageNotes\n *\n * Basic example of how you can enable hydration in your application when\n * `bootstrapApplication` function is used:\n * ```ts\n * bootstrapApplication(AppComponent, {\n *   providers: [provideClientHydration()]\n * });\n * ```\n *\n * Alternatively if you are using NgModules, you would add `provideClientHydration`\n * to your root app module's provider list.\n * ```ts\n * @NgModule({\n *   declarations: [RootCmp],\n *   bootstrap: [RootCmp],\n *   providers: [provideClientHydration()],\n * })\n * export class AppModule {}\n * ```\n *\n * @see {@link withNoHttpTransferCache}\n * @see {@link withHttpTransferCacheOptions}\n * @see {@link withI18nSupport}\n * @see {@link withEventReplay}\n *\n * @param features Optional features to configure additional router behaviors.\n * @returns A set of providers to enable hydration.\n *\n * @publicApi\n */\nfunction provideClientHydration(...features) {\n  const providers = [];\n  const featuresKind = new Set();\n  const hasHttpTransferCacheOptions = featuresKind.has(HydrationFeatureKind.HttpTransferCacheOptions);\n  for (const {\n    ɵproviders,\n    ɵkind\n  } of features) {\n    featuresKind.add(ɵkind);\n    if (ɵproviders.length) {\n      providers.push(ɵproviders);\n    }\n  }\n  if (typeof ngDevMode !== 'undefined' && ngDevMode && featuresKind.has(HydrationFeatureKind.NoHttpTransferCache) && hasHttpTransferCacheOptions) {\n    // TODO: Make this a runtime error\n    throw new Error('Configuration error: found both withHttpTransferCacheOptions() and withNoHttpTransferCache() in the same call to provideClientHydration(), which is a contradiction.');\n  }\n  return makeEnvironmentProviders([typeof ngDevMode !== 'undefined' && ngDevMode ? provideZoneJsCompatibilityDetector() : [], ɵwithDomHydration(), featuresKind.has(HydrationFeatureKind.NoHttpTransferCache) || hasHttpTransferCacheOptions ? [] : ɵwithHttpTransferCache({}), providers]);\n}\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of the platform-browser package.\n */\n/**\n * @publicApi\n */\nconst VERSION = /*#__PURE__*/new Version('19.1.3');\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of this package.\n */\n// This file only reexports content of the `src` folder. Keep it that way.\n\n// This file is not used to build this module. It is only used during editing\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BrowserModule, By, DomSanitizer, EVENT_MANAGER_PLUGINS, EventManager, EventManagerPlugin, HAMMER_GESTURE_CONFIG, HAMMER_LOADER, HammerGestureConfig, HammerModule, HydrationFeatureKind, Meta, REMOVE_STYLES_ON_COMPONENT_DESTROY, Title, VERSION, bootstrapApplication, createApplication, disableDebugTools, enableDebugTools, platformBrowser, provideClientHydration, provideProtractorTestingSupport, withEventReplay, withHttpTransferCacheOptions, withI18nSupport, withIncrementalHydration, withNoHttpTransferCache, BrowserDomAdapter as ɵBrowserDomAdapter, BrowserGetTestability as ɵBrowserGetTestability, DomEventsPlugin as ɵDomEventsPlugin, DomRendererFactory2 as ɵDomRendererFactory2, DomSanitizerImpl as ɵDomSanitizerImpl, HammerGesturesPlugin as ɵHammerGesturesPlugin, INTERNAL_BROWSER_PLATFORM_PROVIDERS as ɵINTERNAL_BROWSER_PLATFORM_PROVIDERS, KeyEventsPlugin as ɵKeyEventsPlugin, SharedStylesHost as ɵSharedStylesHost, initDomAdapter as ɵinitDomAdapter };\n"],"mappings":"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","names":["paramParser","rawParams","codec","map","param","eqIdx","key","val","list","standardEncoding","v","STANDARD_ENCODING_REGEX","s","t","STANDARD_ENCODING_REPLACEMENTS","valueToString","value","mightHaveBody","method","isArrayBuffer","isBlob","isFormData","isUrlSearchParams","addBody","options","body","interceptorChainEndFn","req","finalHandlerFn","adaptLegacyInterceptorToChain","chainTailFn","interceptor","initialRequest","downstreamRequest","chainedInterceptorFn","interceptorFn","injector","runInInjectionContext","legacyInterceptorFnFactory","chain","handler","inject","HTTP_INTERCEPTORS","pendingTasks","PendingTasksInternal","REQUESTS_CONTRIBUTE_TO_STABILITY","taskId","finalize","getResponseUrl","xhr","X_REQUEST_URL_REGEXP","X_REQUEST_URL_HEADER","xsrfInterceptorFn","next","lcUrl","XSRF_ENABLED","token","HttpXsrfTokenExtractor","headerName","XSRF_HEADER_NAME","makeHttpFeature","kind","providers","provideHttpClient","features","HttpClient","HttpXhrBackend","HttpInterceptorHandler","HttpHandler","HttpBackend","FETCH_BACKEND","HTTP_INTERCEPTOR_FNS","HttpXsrfCookieExtractor","feature","makeEnvironmentProviders","withInterceptorsFromDi","HttpFeatureKind","LEGACY_INTERCEPTOR_FN","withXsrfConfiguration","cookieName","XSRF_COOKIE_NAME","HttpHeaders","HttpUrlEncodingCodec","HttpParams","HttpContext","CONTENT_TYPE_HEADER","TEXT_CONTENT_TYPE","JSON_CONTENT_TYPE","ACCEPT_HEADER","HttpRequest","HttpEventType","HttpResponseBase","HttpHeaderResponse","HttpResponse","HttpErrorResponse","HTTP_STATUS_CODE_OK","HTTP_STATUS_CODE_NO_CONTENT","HttpStatusCode","HTTP_ROOT_INTERCEPTOR_FNS","XSSI_PREFIX","XSRF_DEFAULT_COOKIE_NAME","XSRF_DEFAULT_HEADER_NAME","init_http","__esmMin","init_core","init_esm","init_operators","init_common","_HttpHeaders","headers","line","index","name","values","lcName","update","other","clone","base","toDelete","existing","headerValues","fn","_HttpParams","RuntimeError","res","params","updates","_value","eKey","idx","_HttpRequest","url","third","fourth","qIdx","sep","responseType","transferCache","withCredentials","reportProgress","context","init","defaultStatus","defaultStatusText","_HttpHeaderResponse","_HttpResponse","first","events$","of","concatMap","res$","filter","event","callbackParam","__ngFactoryType__","ɵɵinject","ɵɵdefineInjectable","InjectionToken","backend","dedupedInterceptorFns","nextSequencedFn","EnvironmentInjector","xhrFactory","from","switchMap","Observable","observer","detectedType","reqBody","headerResponse","partialFromXhr","statusText","onLoad","status","ok","originalBody","error","onError","sentHeaders","onDownProgress","progressEvent","onUpProgress","progress","XhrFactory","doc","platform","cookieString","parseCookieValue","DOCUMENT","PLATFORM_ID","getBaseElementHref","baseElement","relativePath","url","removeElements","elements","element","createStyleElement","style","doc","styleElement","addServerStyles","appId","inline","external","APP_ID_ATTRIBUTE_NAME","createLinkElement","linkElement","shimContentAttribute","componentShortId","CONTENT_ATTR","COMPONENT_REGEX","shimHostAttribute","HOST_ATTR","shimStylesContent","compId","styles","s","isTemplateNode","node","initDomAdapter","BrowserDomAdapter","errorHandler","ErrorHandler","_document","setDocument","GenericBrowserDomAdapter","BrowserGetTestability","BrowserXhr","EVENT_MANAGER_PLUGINS","EventManager","EventManagerPlugin","SharedStylesHost","NAMESPACE_URIS","COMPONENT_VARIABLE","REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT","REMOVE_STYLES_ON_COMPONENT_DESTROY","DomRendererFactory2","DefaultDomRenderer2","ShadowDomRenderer","NoneEncapsulationDomRenderer","EmulatedEncapsulationDomRenderer2","DomEventsPlugin","MODIFIER_KEYS","_keyMap","MODIFIER_KEY_GETTERS","KeyEventsPlugin","INTERNAL_BROWSER_PLATFORM_PROVIDERS","platformBrowser","TESTABILITY_PROVIDERS","BROWSER_MODULE_PROVIDERS","BrowserModule","Title","DomSanitizer","DomSanitizerImpl","init_platform_browser","__esmMin","init_common","init_core","DomAdapter","_BrowserDomAdapter","setRootDomAdapter","el","evt","listener","options","tagName","target","href","name","parseCookieValue","registry","_global","elem","findInAncestors","testability","RuntimeError","whenAllStable","callback","testabilities","count","decrement","t","getDOM","__ngFactoryType__","ɵɵdefineInjectable","InjectionToken","plugins","_zone","plugin","eventName","handler","ɵɵinject","NgZone","_doc","nonce","platformId","isPlatformServer","urls","value","usages","creator","record","host","hostNode","DOCUMENT","APP_ID","CSP_NONCE","PLATFORM_ID","eventManager","sharedStylesHost","removeStylesOnCompDestroy","ngZone","tracingService","type","ViewEncapsulation","__spreadProps","__spreadValues","renderer","rendererByCompId","platformIsServer","componentId","TracingService","namespace","parent","newChild","refChild","_parent","oldChild","selectorOrNode","preserveContent","namespaceUri","flags","RendererStyleFlags2","event","wrappedCallback","eventHandler","hostEl","component","styleEl","styleUrls","styleUrl","linkEl","parsedEvent","outsideHandler","parts","domEventName","key","fullKey","codeIX","modifierName","index","result","fullKeyCode","keycode","modifierGetter","zone","keyName","PLATFORM_BROWSER_ID","PLATFORM_INITIALIZER","createPlatformFactory","platformCore","TESTABILITY_GETTER","TESTABILITY","Testability","TestabilityRegistry","INJECTOR_SCOPE","RendererFactory2","XhrFactory","ɵɵdefineNgModule","ɵɵdefineInjector","CommonModule","ApplicationModule","newTitle","__ngConditionalFactory__","ctx","SecurityContext","allowSanitizationBypassAndThrow","unwrapSafeValue","_sanitizeHtml","_sanitizeUrl","bypassSanitizationTrustHtml","bypassSanitizationTrustStyle","bypassSanitizationTrustScript","bypassSanitizationTrustUrl","bypassSanitizationTrustResourceUrl"],"x_google_ignoreList":[0,1]}