{"version":3,"file":"ngx-network-error.mjs","sources":["../../../projects/ngx-network-error/src/lib/interfaces.ts","../../../projects/ngx-network-error/src/lib/tokens.ts","../../../projects/ngx-network-error/src/lib/languages/de.lang.ts","../../../projects/ngx-network-error/src/lib/languages/en.lang.ts","../../../projects/ngx-network-error/src/lib/languages/es.lang.ts","../../../projects/ngx-network-error/src/lib/utils.ts","../../../projects/ngx-network-error/src/lib/svgs.ts","../../../projects/ngx-network-error/src/lib/services/language.service.ts","../../../projects/ngx-network-error/src/lib/pipes/translate.pipe.ts","../../../projects/ngx-network-error/src/lib/dialog/error.dialog.ts","../../../projects/ngx-network-error/src/lib/dialog/error.dialog.html","../../../projects/ngx-network-error/src/lib/services/network-checks.ts","../../../projects/ngx-network-error/src/lib/services/utility.service.ts","../../../projects/ngx-network-error/src/lib/login/login.dialog.ts","../../../projects/ngx-network-error/src/lib/login/login.dialog.html","../../../projects/ngx-network-error/src/lib/custom-operators.ts","../../../projects/ngx-network-error/src/lib/services/http-interceptor.ts","../../../projects/ngx-network-error/src/lib/ngx-network-error.module.ts","../../../projects/ngx-network-error/src/public-api.ts","../../../projects/ngx-network-error/src/ngx-network-error.ts"],"sourcesContent":["import { HttpErrorResponse, HttpRequest, HttpResponse } from '@angular/common/http';\r\n\r\nexport interface KeyValueObject {\r\n    [key: string]: any;\r\n}\r\n\r\nexport type NetworkErrorType = 'status' | 'headers' | 'content';\r\n\r\nexport interface NetworkError {\r\n    msg: string;\r\n    type: NetworkErrorType;\r\n    messageCode: keyof Language;\r\n    info: NetworkInfo;\r\n    icon: string;\r\n    email: boolean;\r\n    reload: boolean;\r\n}\r\n\r\nexport interface NetworkInfo {\r\n    response: HttpResponse<any> | HttpErrorResponse;\r\n    request: HttpRequest<any>\r\n}\r\n\r\nexport interface ContentParams {\r\n    headers?: KeyValueObject;\r\n    match?: RegExp | string;\r\n    shouldMatchContentType?: any | void;\r\n}\r\n\r\nexport interface TestcaseRequest {\r\n    headers?: KeyValueObject;\r\n    status?: number;\r\n    content?: any;\r\n    testcase?: ContentParams;\r\n}\r\n\r\n// Root interface for the user\r\nexport interface NgxNetworkErrorConfiguration {\r\n    /** Enable debugging of plugin */\r\n    debug?: boolean;\r\n    /** Default authentication on the application used, it is useful to the call to action, provide 'custom' to provide custom implementation using ErrorStream */\r\n    authType?: 'basic' | 'openid' | 'cognos' | 'custom';\r\n    /** Namespace to use in case of Cognos Authentication */\r\n    cognosNamespace?: string;\r\n    /** Contacts information (multiple) */\r\n    contacts?: NetworkErrorContact[];\r\n    /** Reporting information, who or where to report the errors */\r\n    reporting?: NetworkErrorReporting;\r\n    /** If silent is provided true, all failing requests won't show any error dialog or console error */\r\n    silent?: boolean;\r\n    /** Provide custom configuration for retrying requests */\r\n    retry?: NetworkRetry;\r\n    /** Provide language for error or login dialogs, can be changed using the utility service and it's English by default */\r\n    language?: Languages;\r\n    /** If provided, in any request will be added a version number as \"v\" GET param. It is not affected by ignoreDiskCache */\r\n    version?: string;\r\n    /** Provide any custom data */\r\n    customData?: any;\r\n}\r\n  \r\nexport interface NetworkRetry {\r\n    /** How many times should the request be retried successfully */\r\n    count?: number;\r\n    /** How many time (milliseconds) to many until next retry */\r\n    delay?: number;\r\n    /** If set to greater than 0 will be added on each retry */\r\n    increment?: number;\r\n}\r\n  \r\n// Contact interface for the developers\r\n// Example: Used in the error dialog\r\nexport interface NetworkErrorContact {\r\n    /** Email address of the contact */\r\n    email?: string;\r\n    /** Full name of the contact */\r\n    name?: string;\r\n    /** Telephone of the contact (better with country prefix) */\r\n    telephone?: string;\r\n}\r\n  \r\n// Reporting interface for the user\r\n// Example: Used in the interceptor\r\nexport interface NetworkErrorReporting {\r\n    /** Sentry URL to report the error to */\r\n    sentryDSN?: string;\r\n    /** Email address to report the error to */\r\n    email?: string;\r\n    /** Use it to ignore specific errors */\r\n    ignoreErrors?: string[];\r\n}\r\n\r\n/** All the params the developer can tell to the interceptor */\r\nexport interface RequestParams {\r\n    /** If set true the Error Interceptor won't be used */\r\n    skipInterceptor?: boolean;\r\n    /** Provide configuration for retrying this request, only used if also property important is set to true */\r\n    retry?: NetworkRetry;\r\n    /** If silent is provided true, this request won't show any error dialog or console error */\r\n    silent?: boolean;\r\n    /** Object containing all content checks which should be performed against the response */\r\n    contentChecks?: ContentParams;\r\n    /** If true Disk Cache will be bypassed by adding random parameter to request */\r\n    ignoreDiskCache?: boolean;\r\n    /** If true Service Worker cache will be bypassed by adding ngsw-bypass header */\r\n    ignoreServiceWorkerCache?: boolean;\r\n    /** If true Backend Proxy cache will be bypassed using Cache-Control header */\r\n    ignoreProxyCache?: boolean;\r\n    /** If set true and request fails, it will be retried. Works in combination of retry parameter */\r\n    important?: boolean;\r\n}\r\n\r\n/**\r\n * Interface of any language used for messages in dialog\r\n * NOTES:\r\n *   • Every message code accepts a string or string array, if message is an array a sentence will be picked randomly\r\n *   • Every message accepts HTML syntax\r\n */\r\nexport interface Language {\r\n    // Error codes\r\n    Status_4xx: string | string[];\r\n    Status_400: string | string[];\r\n    Status_401_441: string | string[];\r\n    Status_403: string | string[];\r\n    Status_404: string | string[];\r\n    Status_408: string | string[];\r\n    Status_410: string | string[];\r\n    Status_415: string | string[];\r\n    Status_5xx: string | string[];\r\n    Status_500: string | string[];\r\n    Status_501: string | string[];\r\n    Status_502: string | string[];\r\n    Status_503: string | string[];\r\n    Status_504: string | string[];\r\n    Status_0: string | string[];\r\n    Retry: string | string[];\r\n    Bad_Content: string | string[];\r\n    Bad_Headers: string | string[];\r\n    Unknown: string | string[]; // Used when the error is undefined or generic\r\n    \r\n    // ErrorDialog translations (session expired)\r\n    ErrorDialog_session_expired: string | string[];\r\n    ErrorDialog_please_reload: string | string[];\r\n    ErrorDialog_reload_btn: string | string[];\r\n    // ErrorDialog translations\r\n    ErrorDialog_oops: string | string[];\r\n    ErrorDialog_contacts: string | string[];\r\n    ErrorDialog_contact_name: string | string[];\r\n    ErrorDialog_contact_email: string | string[];\r\n    ErrorDialog_contact_telephone: string | string[];\r\n    ErrorDialog_email_sended: string | string[];\r\n    ErrorDialog_administrator: string | string[];\r\n    ErrorDialog_close_btn: string | string[];\r\n    // LoginDialog translations\r\n    LoginDialog_login_title: string | string[];\r\n    LoginDialog_user: string | string[];\r\n    LoginDialog_password: string | string[];\r\n    LoginDialog_login_btn: string | string[];\r\n}\r\n\r\nexport type Languages = 'en' | 'de' | 'es';\r\n\r\nexport type AllLanguages = {\r\n    [language in Languages]: Partial<Language>;\r\n};\r\n\r\n/** Used to identify dialogs across plugin */\r\nexport enum DialogIds {\r\n    Login = 'login',\r\n    Error = 'error'\r\n}\r\n\r\nexport interface IHttpParams {\r\n    [param: string]: string;\r\n}\r\n\r\nexport interface IHttpHeaders {\r\n    [name: string]: string | string[];\r\n}\r\n\r\nexport type IResponseType = 'arraybuffer' | 'blob' | 'json' | 'text';","import { InjectionToken } from '@angular/core';\r\nimport { NgxNetworkErrorConfiguration } from './interfaces';\r\n\r\n/** InjectionToken for Global Configuration */\r\nexport const GlobalConfig = new InjectionToken<NgxNetworkErrorConfiguration>('PLUGIN_CONFIGURATION');","import { Language } from '../interfaces';\r\n\r\nexport const Lang_Deutsch: Partial<Language> = {\r\n    Status_4xx: 'Der Client hat etwas falsch gemacht, aber wir sind nicht sicher, was. Die Entwickler werden sich die Sache genauer ansehen.',\r\n    Status_400: 'Schlechte Anfrage gefunden, bedeutet normalerweise, dass unsere Entwickler bei der Anfrage an den Server einen Fehler gemacht haben.',\r\n    Status_401_441: [\r\n        'Es sieht so aus, als ob Sie nicht im System angemeldet sind. Bitte melden Sie sich am System an.',\r\n        'Versuchen Sie, auf die Website zuzugreifen, ohne sich am System anzumelden? Hmmmmmmmm, passiert nicht.'\r\n    ],\r\n    Status_403: [\r\n        'Sind Sie sicher, dass Sie Berechtigungen für die Ressource haben, auf die Sie zuzugreifen versuchen.',\r\n        'Nein! Wir können Sie nicht durchlassen, Sie haben keine Berechtigung, diese Ressource anzuzeigen.'\r\n    ],\r\n    Status_404: [\r\n        'Diese Datei hat nie existiert oder sie wurde an einen anderen Ort verschoben.',\r\n        'Sind Sie aus der Zukunft gekommen? Denn diese Datei existiert nicht in der Gegenwart.',\r\n        'Sorry :( - Konnte die gesuchte Datei nicht finden.'\r\n    ],\r\n    Status_408: 'Die Anfrage hat viel zu lange gedauert, so dass der Server die Verbindung geschlossen hat.',\r\n    Status_410: [\r\n        'Diese Datei ist dauerhaft verschwunden, vielleicht an einen anderen Ort verschoben?',\r\n        'Diese Datei sieht aus, als ob sie existierte, aber jetzt dauerhaft an einen anderen Ort verschoben wurde.'\r\n    ],\r\n    Status_415: [\r\n        'Anfrage wurde vom Server aufgrund eines schlechten Datenformats abgelehnt. Das geht auf uns.',\r\n        'Beim Versuch, die Daten an den Server zu senden, ist uns ein Fehler unterlaufen, die Anfrage wurde abgelehnt.'\r\n    ],\r\n    Status_5xx: 'Auf unserer Seite ist ein Fehler aufgetreten, aber wir sind nicht sicher, was genau passiert ist. Die Entwickler werden sich das Problem genauer ansehen.',\r\n    Status_500: [\r\n        'Es ist etwas auf unserer Seite passiert. Wir entschuldigen uns dafür und werden uns das so schnell wie möglich ansehen.'\r\n    ],\r\n    Status_501: [\r\n        'Kommen Sie aus der Zukunft? Denn die Funktionalität, die Sie suchen, ist bei uns noch nicht implementiert.'\r\n    ],\r\n    Status_502: 'Sie haben eine fehlerhafte Antwort vom Server erhalten. Machen Sie vielleicht eine Pause, während wir versuchen, das Problem zu beheben.',\r\n    Status_503: [\r\n        'Unsere Server sind derzeit down, bitte kommen Sie später wieder.',\r\n        'Jemand hat auf unserer Seite einen Fehler gemacht und Sie müssen die Konsequenzen tragen. Es tut uns sehr leid, wir werden versuchen, das Problem so schnell wie möglich zu beheben.'\r\n    ],\r\n    Status_504: 'Der Server hat zu lange gebraucht, um auf unsere Anfrage zu antworten, vielleicht ist er überlastet, versuchen Sie es später noch einmal.',\r\n    Status_0: 'Es ist ein Netzwerkfehler aufgetreten, keine Sorge, wenn das Problem von unserer Seite kommt, wird es so schnell wie möglich behoben.',\r\n    Retry: 'Erhielt keine erwartete Antwort vom Server. Werde es in Kürze erneut versuchen.',\r\n    Bad_Content: 'Unerwarteter Inhalt vom Backend empfangen. Sie können nicht viel dagegen tun, vielleicht versuchen Sie es später noch einmal?',\r\n    Bad_Headers: 'Unerwartete Header vom Backend empfangen. Sie können nicht viel dagegen tun, vielleicht versuchen Sie es später noch einmal?',\r\n    Unknown: 'Es ist ein Fehler aufgetreten, den selbst wir nicht kennen. Wir werden den Fehler überprüfen und versuchen, ihn so schnell wie möglich zu beheben.',\r\n\r\n    // Add missing translations for Statuses\r\n    ErrorDialog_oops: 'Ups, ein Fehler ist aufgetreten',\r\n    ErrorDialog_contact_email: 'E-Mail',\r\n    ErrorDialog_contact_name: 'Name',\r\n    ErrorDialog_contact_telephone: 'Telefon',\r\n    ErrorDialog_contacts: 'Kontakte',\r\n    ErrorDialog_email_sended: 'Es wurde eine E-Mail mit den Fehlerdetails versendet und der Fehler wird so schnell wie möglich behoben.',\r\n    ErrorDialog_administrator: 'Bitte wenden Sie sich an Ihren Systemadministrator.',\r\n    ErrorDialog_close_btn: 'Schließen',\r\n    ErrorDialog_reload_btn: 'Neu laden',\r\n    ErrorDialog_please_reload: 'Bitte klicken Sie auf Neu laden, um diese Anwendung weiter zu verwenden.',\r\n    ErrorDialog_session_expired: 'Sitzung Abgelaufen',\r\n    LoginDialog_login_title: 'Login',\r\n    LoginDialog_user: 'Benutzer',\r\n    LoginDialog_password: 'Passwort',\r\n    LoginDialog_login_btn: 'LOGIN'\r\n}","import { Language } from '../interfaces';\r\n\r\nexport const Lang_English: Partial<Language> = {\r\n    Status_4xx: 'The client did something wrong, but we are not sure what. Developers will take a look at it in more details.',\r\n    Status_400: 'Bad request found, usually mean our developers messed up while making the request to the server.',\r\n    Status_401_441: [\r\n        'It looks like you are not logged in the system. Please login to the system.',\r\n        'Are you trying to access the website without logging in to the system? Hmmmmmmmm, not happening.'\r\n    ],\r\n    Status_403: [\r\n        'Are you sure you have permissions to the resource you are trying to access.',\r\n        'No! Can\\'t let you go through, you don\\'t have permissions to view this resource.'\r\n    ],\r\n    Status_404: [\r\n        'This file never existed or it has been moved to some other place.',\r\n        'Did you come from the future? Because this file does not exist in present.',\r\n        'Sorry :( - Could not find the file you where looking for.'\r\n    ],\r\n    Status_408: 'The request took way too long to finish, so the server closed the connection.',\r\n    Status_410: [\r\n        'This file has been permanently gone, maybe moved to some other place?',\r\n        'This file looks like it existed, but now has been moved permanently to some other place.'\r\n    ],\r\n    Status_415: [\r\n        'Request rejected by the server because of bad data format. That\\'s on us.',\r\n        'We made a mistake while trying to send the data to the server, the request got rejected.'\r\n    ],\r\n    Status_5xx: 'An error occurred on our end, but we are not sure what exactly happened. Developers will take a look at it in more details.',\r\n    Status_500: [\r\n        'Something happened on our end. We apologize, we take look into it ASAP.'\r\n    ],\r\n    Status_501: [\r\n        'Did you come from the future? Because the functionality you are looking for is not yet implemented on our end.'\r\n    ],\r\n    Status_502: 'Got an incorrect response from the server, maybe take a break while we\\'ll try to fix the issue.',\r\n    Status_503: [\r\n        'Our server are currently down, please come back later.',\r\n        'Someone messed up on our end and you have to face the consequences, we are so sorry, we will try to fix it ASAP.'\r\n    ],\r\n    Status_504: 'Server took too long to respond to our request, maybe it\\'s overloaded, try later in a bit.',\r\n    Status_0: 'Some network error occurred, fear not, if the issue come from our end it will be fixed ASAP.',\r\n    Retry: 'Did not get expected response from the server. Will try again in a bit.',\r\n    Bad_Content: 'Unexpected content received from the backend. Not much you can do about it, maybe try again later?',\r\n    Bad_Headers: 'Unexpected headers received from the backend. Not much you can do about it, maybe try again later?',\r\n    Unknown: 'An error happened that even we don\\'t know. We\\'ll review the error and try to fix it ASAP.',\r\n\r\n    // Add missing translations for Statuses\r\n    ErrorDialog_oops: 'Oops, an error has occurred',\r\n    ErrorDialog_contact_email: 'Email',\r\n    ErrorDialog_contact_name: 'Name',\r\n    ErrorDialog_contact_telephone: 'Telephone',\r\n    ErrorDialog_contacts: 'Contacts',\r\n    ErrorDialog_email_sended: 'An email has been sent with the error details and it will be fixed as soon as possible.',\r\n    ErrorDialog_administrator: 'Please contact your system administrator.',\r\n    ErrorDialog_close_btn: 'Close',\r\n    ErrorDialog_reload_btn: 'Reload',\r\n    ErrorDialog_please_reload: 'Please click Reload to continue using this application.',\r\n    ErrorDialog_session_expired: 'Session Expired',\r\n    LoginDialog_login_title: 'Login',\r\n    LoginDialog_user: 'User',\r\n    LoginDialog_password: 'Password',\r\n    LoginDialog_login_btn: 'LOGIN'\r\n}","import { Language } from '../interfaces';\r\n\r\nexport const Lang_Spanish: Partial<Language> = {\r\n    Status_4xx: 'El cliente hizo algo malo, pero no estamos seguros de qué. Los desarrolladores le echarán un vistazo con más detalle.',\r\n    Status_400: 'Una mala solicitud encontrada, normalmente significa que nuestros desarrolladores se equivocaron al hacer la solicitud al servidor.',\r\n    Status_401_441: [\r\n        'Parece que no estás registrado en el sistema. Por favor, inicie sesión en el sistema.',\r\n        '¿Intenta acceder a la página web sin entrar en el sistema? Hmmmmmmmm, no está sucediendo.'\r\n    ],\r\n    Status_403: [\r\n        '¿Está seguro de que tiene permisos para el recurso al que está intentando acceder.',\r\n        'No! No puedo dejarte pasar, no tienes permiso para ver este recurso.'\r\n    ],\r\n    Status_404: [\r\n        'Este archivo nunca existió o ha sido trasladado a otro lugar.',\r\n        '¿Vienes del futuro? Porque este archivo no existe en el presente.',\r\n        'Lo sientimos :( - No pude encontrar el archivo que buscaba.'\r\n    ],\r\n    Status_408: 'La solicitud tardó demasiado en terminar, así que el servidor cerró la conexión.',\r\n    Status_410: [\r\n        'Este archivo ha desaparecido permanentemente, ¿tal vez se ha trasladado a otro lugar?',\r\n        'Este archivo parece haber existido, pero ahora ha sido trasladado permanentemente a otro lugar.'\r\n    ],\r\n    Status_415: [\r\n        'Solicitud rechazada por el servidor debido a un mal formato de datos. Eso es cosa nuestra.',\r\n        'Cometimos un error al tratar de enviar los datos al servidor, la solicitud fue rechazada.'\r\n    ],\r\n    Status_5xx: 'Se produjo un error de nuestra parte, pero no estamos seguros de lo que pasó exactamente. Los desarrolladores le echarán un vistazo con más detalle.',\r\n    Status_500: [\r\n        'Algo pasó en nuestro lado. Nos disculpamos, lo investigaremos lo antes posible.'\r\n    ],\r\n    Status_501: [\r\n        '¿Vienes del futuro? Porque la funcionalidad que buscas aún no está implementada en nuestro lado.'\r\n    ],\r\n    Status_502: 'Recibí una respuesta incorrecta del servidor, tal vez debería tomarse un descanso mientras tratamos de arreglar el problema.',\r\n    Status_503: [\r\n        'Nuestro servidor está actualmente caído, por favor vuelva más tarde.',\r\n        'Alguien la cagó de nuestro lado y tienes que enfrentar las consecuencias, lo sentimos mucho, trataremos de arreglarlo lo antes posible.'\r\n    ],\r\n    Status_504: 'El servidor tardó mucho en responder a nuestra petición, tal vez esté sobrecargado, inténtelo más tarde en un rato.',\r\n    Status_0: 'Ocurrió algún error en la red, no tema, si el problema viene de nuestro lado se arreglará lo antes posible.',\r\n    Retry: 'No obtuvimos la respuesta esperada del servidor. Lo intentaré de nuevo en un rato.',\r\n    Bad_Content: 'Contenido inesperado recibido del servidor. No hay mucho que puedas hacer al respecto, ¿Tal vez intentarlo de nuevo más tarde?',\r\n    Bad_Headers: 'Cabeceras inesperadas recibidas desde servidor. No hay mucho que puedas hacer al respecto, ¿Tal vez intentarlo de nuevo más tarde?',\r\n    Unknown: 'Ocurrió un error que ni siquiera nosotros conocemos. Revisaremos el error e intentaremos arreglarlo lo antes posible.',\r\n\r\n    // Add missing translations for Statuses\r\n    ErrorDialog_oops: 'Uy, se ha producido un error',\r\n    ErrorDialog_contact_email: 'Correo electrónico',\r\n    ErrorDialog_contact_name: 'Nombre',\r\n    ErrorDialog_contact_telephone: 'Teléfono',\r\n    ErrorDialog_contacts: 'Contactos',\r\n    ErrorDialog_email_sended: 'Se ha enviado un correo electrónico con los detalles del error y se arreglará lo antes posible.',\r\n    ErrorDialog_administrator: 'Por favor, póngase en contacto con el administrador del sistema.',\r\n    ErrorDialog_close_btn: 'Cerrar',\r\n    ErrorDialog_reload_btn: 'Recarga',\r\n    ErrorDialog_please_reload: 'Por favor, haga clic en Recargar para seguir usando esta aplicación.',\r\n    ErrorDialog_session_expired: 'La sesión expiró',\r\n    LoginDialog_login_title: 'Iniciar Sesión',\r\n    LoginDialog_user: 'Usuario',\r\n    LoginDialog_password: 'Contraseña',\r\n    LoginDialog_login_btn: 'Iniciar Sesión'\r\n}","import { HttpParams } from \"@angular/common/http\";\r\nimport { NetworkError, RequestParams } from \"./interfaces\";\r\n\r\n/**\r\n * Simple object check.\r\n *\r\n *    isObject({a:1}) //=> true\r\n *    isObject(1) //=> false\r\n *\r\n * @ignore\r\n */\r\nexport const isObject = (item: any) => {\r\n    return item && typeof item === 'object' && !Array.isArray(item);\r\n  };\r\n\r\n/**\r\n * Deep merge two objects.\r\n *\r\n *    mergeDeep({a:1, b:{x: 1, y:2}}, {b:{x: 3}, c:4}) //=> {a:1, b:{x:3, y:2}, c:4}\r\n *\r\n * @param base base object onto which `sources` will be applied\r\n */\r\nexport const mergeDeep = (base: any, ...sources: any[]): any => {\r\n    if (!sources.length) return base;\r\n    const source = sources.shift();\r\n  \r\n    if (isObject(base) && isObject(source)) {\r\n      for (const key in source) {\r\n        if (isObject(source[key])) {\r\n          if (!base[key]) Object.assign(base, { [key]: {} });\r\n          mergeDeep(base[key], source[key]);\r\n        } else {\r\n          Object.assign(base, { [key]: source[key] });\r\n        }\r\n      }\r\n    }\r\n  \r\n    return mergeDeep(base, ...sources);\r\n};\r\n\r\n/**\r\n * Custom HttpParams class to be able to handle custom parameters for the Interceptor\r\n */\r\nexport class InterceptorParams extends HttpParams {\r\n  constructor(\r\n    public requestParams: RequestParams,\r\n    params?: { [param: string]: string | string[] }\r\n  ) {\r\n    super({ fromObject: params });\r\n  }\r\n}\r\n\r\n/**\r\n * Converts a non Error type object to Error type\r\n * @param err Error object to convert\r\n */\r\nexport const toError = (err: Error | NetworkError) => {\r\n  if (err instanceof Error) return err;\r\n  const newErr = new Error(err.msg || 'Unknown error');\r\n  for (const [key, value] of Object.entries(err)) {\r\n    newErr[key] = value;\r\n  }\r\n  return newErr;\r\n}","\r\nexport const Error4xxSVG = 'data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjUxMnB0IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgd2lkdGg9IjUxMnB0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0wIDk2djM4NGMwIDE3LjY3OTY4OCAxNC4zMjAzMTIgMzIgMzIgMzJoNDQ4YzE3LjY3OTY4OCAwIDMyLTE0LjMyMDMxMiAzMi0zMnYtMzg0em0wIDAiIGZpbGw9IiNlMWVhZjciLz48cGF0aCBkPSJtMCAwaDUxMnYxMjhoLTUxMnptMCAwIiBmaWxsPSIjYjBiZWM1Ii8+PHBhdGggZD0ibTY0IDQ4aDMydjMyaC0zMnptMCAwIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0ibTEyOCA0OGgzMnYzMmgtMzJ6bTAgMCIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Im00MzIgODBoLTIyNGMtOC44MzIwMzEgMC0xNi03LjE2Nzk2OS0xNi0xNnM3LjE2Nzk2OS0xNiAxNi0xNmgyMjRjOC44MzIwMzEgMCAxNiA3LjE2Nzk2OSAxNiAxNnMtNy4xNjc5NjkgMTYtMTYgMTZ6bTAgMCIgZmlsbD0iIzkwYTRhZSIvPjxwYXRoIGQ9Im0zODQgMzIwYzAgNzAuNjkxNDA2LTU3LjMwODU5NCAxMjgtMTI4IDEyOHMtMTI4LTU3LjMwODU5NC0xMjgtMTI4IDU3LjMwODU5NC0xMjggMTI4LTEyOCAxMjggNTcuMzA4NTk0IDEyOCAxMjh6bTAgMCIgZmlsbD0iI2U3NmU1NCIvPjxwYXRoIGQ9Im0zMTUuMzEyNSAyODMuMzEyNS0yMi42MjUtMjIuNjI1LTM2LjY4NzUgMzYuNjg3NS0zNi42ODc1LTM2LjY4NzUtMjIuNjI1IDIyLjYyNSAzNi42ODc1IDM2LjY4NzUtMzYuNjg3NSAzNi42ODc1IDIyLjYyNSAyMi42MjUgMzYuNjg3NS0zNi42ODc1IDM2LjY4NzUgMzYuNjg3NSAyMi42MjUtMjIuNjI1LTM2LjY4NzUtMzYuNjg3NXptMCAwIiBmaWxsPSIjZmZmIi8+PC9zdmc+';\r\nexport const Error5xxSVG = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggc3R5bGU9ImZpbGw6I0UxRTRGQjsiIGQ9Ik0zOTIsMzE2Ljl2MTIwYzAsNDkuMi05OS4xMDEsNzUtMTk2LDc1UzAsNDg2LjEsMCw0MzYuOXYtMTIwSDM5MnoiLz4NCjxnPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiNDNUM5Rjc7IiBkPSJNMzkyLDMxNi45djEyMGMwLDQ5LjItOTkuMTAxLDc1LTE5Niw3NXYtMTk1SDM5MnoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojQzVDOUY3OyIgZD0iTTM5MiwyNTYuOXY5MGMwLDQ5LjItOTkuMTAxLDc1LTE5Niw3NVMwLDM5Ni4xLDAsMzQ2Ljl2LTkwSDM5MnoiLz4NCjwvZz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNBOEFGRjE7IiBkPSJNMzkyLDI1Ni45djkwYzAsNDkuMi05OS4xMDEsNzUtMTk2LDc1di0xNjVIMzkyeiIvPg0KPHBhdGggc3R5bGU9ImZpbGw6I0UxRTRGQjsiIGQ9Ik0zOTIsMTY0Ljl2OTJjMCw0OS4yLTk5LjEwMSw3NS0xOTYsNzVTMCwzMDYuMSwwLDI1Ni45di05MkgzOTJ6Ii8+DQo8Zz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojQzVDOUY3OyIgZD0iTTM5MiwxNjQuOXY5MmMwLDQ5LjItOTkuMTAxLDc1LTE5Niw3NXYtMTY3SDM5MnoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojQzVDOUY3OyIgZD0iTTM5Miw3My45djkxYzAsNDkuMi05OS4xMDEsNzctMTk2LDc3UzAsMjE0LjEsMCwxNjQuOXYtOTFDMCw3My45LDM5Miw3My45LDM5Miw3My45eiIvPg0KPC9nPg0KPHBhdGggc3R5bGU9ImZpbGw6I0E4QUZGMTsiIGQ9Ik0zOTIsNzMuOXY5MWMwLDQ5LjItOTkuMTAxLDc3LTE5Niw3N3YtMTY4QzE5Niw3My45LDM5Miw3My45LDM5Miw3My45eiIvPg0KPHBhdGggc3R5bGU9ImZpbGw6I0UxRTRGQjsiIGQ9Ik0xOTYsMC4xQzk4LjUsMC4xLDAsMjQuNywwLDczLjlzOTkuMTAxLDc1LDE5Niw3NXMxOTYtMjUuOCwxOTYtNzVTMjkzLjUsMC4xLDE5NiwwLjF6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojQzVDOUY3OyIgZD0iTTM5Miw3My45YzAsNDkuMi05OS4xMDEsNzUtMTk2LDc1VjAuMUMyOTMuNSwwLjEsMzkyLDI0LjcsMzkyLDczLjl6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkQwMDNBOyIgZD0iTTM3NywyNDEuOWMtNzQuMzk5LDAtMTM1LDYwLjU5OS0xMzUsMTM1YzAsNzQuMzk5LDYwLjYwMSwxMzUsMTM1LDEzNXMxMzUtNjAuNjAxLDEzNS0xMzUNCglDNTEyLDMwMi40OTksNDUxLjM5OSwyNDEuOSwzNzcsMjQxLjl6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojRTUwMDI3OyIgZD0iTTUxMiwzNzYuOWMwLDc0LjM5OS02MC42MDEsMTM1LTEzNSwxMzV2LTI3MEM0NTEuMzk5LDI0MS45LDUxMiwzMDIuNDk5LDUxMiwzNzYuOXoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNFMUU0RkI7IiBkPSJNMzkyLDMxNi45djYwYzAsOC4zOTktNi41OTksMTUtMTUsMTVzLTE1LTYuNjAxLTE1LTE1di02MGMwLTguNDAxLDYuNTk5LTE1LDE1LTE1DQoJUzM5MiwzMDguNDk5LDM5MiwzMTYuOXoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNDNUM5Rjc7IiBkPSJNMzkyLDMxNi45djYwYzAsOC4zOTktNi41OTksMTUtMTUsMTV2LTkwQzM4NS40MDEsMzAxLjksMzkyLDMwOC40OTksMzkyLDMxNi45eiIvPg0KPHBhdGggc3R5bGU9ImZpbGw6I0UxRTRGQjsiIGQ9Ik0zOTIsNDM2LjljMCw4LjM5OS02LjU5OSwxNS0xNSwxNXMtMTUtNi42MDEtMTUtMTVjMC04LjQwMSw2LjU5OS0xNSwxNS0xNVMzOTIsNDI4LjQ5OSwzOTIsNDM2Ljl6Ig0KCS8+DQo8cGF0aCBzdHlsZT0iZmlsbDojQzVDOUY3OyIgZD0iTTM5Miw0MzYuOWMwLDguMzk5LTYuNTk5LDE1LTE1LDE1di0zMEMzODUuNDAxLDQyMS45LDM5Miw0MjguNDk5LDM5Miw0MzYuOXoiLz4NCjwvc3ZnPg0K';\r\nexport const ParseSVG = 'data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNjQgNjQiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHdpZHRoPSI1MTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGc+PGcgZmlsbD0iI2M3ZTJmYyI+PHBhdGggZD0ibTcgMmgxNHYxNmgtMTR6Ii8+PHBhdGggZD0ibTI1IDJoMTR2MTZoLTE0eiIvPjxwYXRoIGQ9Im00MyAyaDE0djE2aC0xNHoiLz48L2c+PHBhdGggZD0ibTcgNy43NDljMy44MyAyLjAyMyA4LjY1MSAzLjQ0IDE0IDMuOTkydi05Ljc0MWgtMTR6IiBmaWxsPSIjZWJmN2ZlIi8+PHBhdGggZD0ibTI1IDExLjk4NmMuMzMzLjAwNi42NjUuMDE0IDEgLjAxNCA0LjY5NCAwIDkuMTE0LS42NjMgMTMtMS44M3YtOC4xN2gtMTR6IiBmaWxsPSIjZWJmN2ZlIi8+PHBhdGggZD0ibTQzIDguNzFjMy45NDctMS43MjYgNy4wNjQtNC4wMzkgOC45NTctNi43MWgtOC45NTd6IiBmaWxsPSIjZWJmN2ZlIi8+PHBhdGggZD0ibTEyIDI4IDE3IDE3djdsNi0ydi01bDE3LTE3IiBmaWxsPSIjOTc2OTQ3Ii8+PHBhdGggZD0ibTEyIDIyaDQwdjZoLTQweiIgZmlsbD0iI2MxOGU1OSIvPjxnPjxwYXRoIGQ9Im0xNSA2MmgtMnYtNC4xMzJsLTEuNDQ1Ljk2NC0xLjEwOS0xLjY2NCAzLTJjLjMwNy0uMjA0LjcwMS0uMjI1IDEuMDI2LS4wNS4zMjUuMTc0LjUyOC41MTMuNTI4Ljg4MnoiIGZpbGw9IiM2NjllNGYiLz48L2c+PGc+PHBhdGggZD0ibTIyIDYzaC00Yy0uNTUyIDAtMS0uNDQ3LTEtMXYtNGMwLS41NTMuNDQ4LTEgMS0xaDRjLjU1MiAwIDEgLjQ0NyAxIDF2NGMwIC41NTMtLjQ0OCAxLTEgMXptLTMtMmgydi0yaC0yeiIgZmlsbD0iIzY2OWU0ZiIvPjwvZz48Zz48cGF0aCBkPSJtMzAgNjJoLTJ2LTQuMTMybC0xLjQ0NS45NjQtMS4xMDktMS42NjQgMy0yYy4zMDctLjIwNC43MDItLjIyNSAxLjAyNi0uMDUuMzI1LjE3NC41MjguNTEzLjUyOC44ODJ6IiBmaWxsPSIjNjY5ZTRmIi8+PC9nPjxnPjxwYXRoIGQ9Im0zNyA2M2gtNGMtLjU1MiAwLTEtLjQ0Ny0xLTF2LTRjMC0uNTUzLjQ0OC0xIDEtMWg0Yy41NTIgMCAxIC40NDcgMSAxdjRjMCAuNTUzLS40NDggMS0xIDF6bS0zLTJoMnYtMmgtMnoiIGZpbGw9IiM2NjllNGYiLz48L2c+PGc+PHBhdGggZD0ibTQ1IDYyaC0ydi00LjEzMmwtMS40NDUuOTY0LTEuMTA5LTEuNjY0IDMtMmMuMzA3LS4yMDQuNzAxLS4yMjUgMS4wMjYtLjA1LjMyNS4xNzQuNTI4LjUxMy41MjguODgyeiIgZmlsbD0iIzY2OWU0ZiIvPjwvZz48Zz48cGF0aCBkPSJtNTIgNjNoLTRjLS41NTIgMC0xLS40NDctMS0xdi00YzAtLjU1My40NDgtMSAxLTFoNGMuNTUyIDAgMSAuNDQ3IDEgMXY0YzAgLjU1My0uNDQ4IDEtMSAxem0tMy0yaDJ2LTJoLTJ6IiBmaWxsPSIjNjY5ZTRmIi8+PC9nPjxnPjxwYXRoIGQ9Im05IDRoMnYyaC0yeiIgZmlsbD0iIzg4OTJhMCIvPjwvZz48Zz48cGF0aCBkPSJtMTIgNGg3djJoLTd6IiBmaWxsPSIjODg5MmEwIi8+PC9nPjxnPjxwYXRoIGQ9Im0xNyA4aDJ2MmgtMnoiIGZpbGw9IiM4ODkyYTAiLz48L2c+PGc+PHBhdGggZD0ibTkgOGg3djJoLTd6IiBmaWxsPSIjODg5MmEwIi8+PC9nPjxnPjxwYXRoIGQ9Im0yNyA0aDJ2MmgtMnoiIGZpbGw9IiM4ODkyYTAiLz48L2c+PGc+PHBhdGggZD0ibTMwIDRoN3YyaC03eiIgZmlsbD0iIzg4OTJhMCIvPjwvZz48Zz48cGF0aCBkPSJtMzUgOGgydjJoLTJ6IiBmaWxsPSIjODg5MmEwIi8+PC9nPjxnPjxwYXRoIGQ9Im0yNyA4aDd2MmgtN3oiIGZpbGw9IiM4ODkyYTAiLz48L2c+PGc+PHBhdGggZD0ibTQ1IDRoMnYyaC0yeiIgZmlsbD0iIzg4OTJhMCIvPjwvZz48Zz48cGF0aCBkPSJtNDggNGg3djJoLTd6IiBmaWxsPSIjODg5MmEwIi8+PC9nPjxnPjxwYXRoIGQ9Im01MyA4aDJ2MmgtMnoiIGZpbGw9IiM4ODkyYTAiLz48L2c+PGc+PHBhdGggZD0ibTQ1IDhoN3YyaC03eiIgZmlsbD0iIzg4OTJhMCIvPjwvZz48L2c+PC9zdmc+';\r\nexport const NetworkSVG = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDc5LjkxIDQ3OS45MSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDc5LjkxIDQ3OS45MTsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0yOTYuMjUxLDM5Ny44NTZjLTAuMTI4LTEuNzUyLTAuMjU2LTMuNTA0LTAuMjY0LTUuMjk2DQoJCUMyOTUuOTk1LDM5NC4zNTIsMjk2LjEyMywzOTYuMTA0LDI5Ni4yNTEsMzk3Ljg1NnoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTI5Ni43NTUsMzgxLjQzMmMwLjI0LTEuNzc2LDAuNDY0LTMuNTYsMC44LTUuMjk2Yy0wLjA4OCwwLjQ0OC0wLjIwOCwwLjg3Mi0wLjI4OCwxLjMyDQoJCUMyOTcuMDExLDM3OC43OTIsMjk2LjkwNywzODAuMTA0LDI5Ni43NTUsMzgxLjQzMkwyOTYuNzU1LDM4MS40MzJ6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0yOTYuMzMxLDM4NC41MzZjLTAuMTQ0LDEuNi0wLjE4NCwzLjItMC4yNCw0Ljc1MkMyOTYuMTQ3LDM4Ny42OTYsMjk2LjE4NywzODYuMTA0LDI5Ni4zMzEsMzg0LjUzNg0KCQl6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zNzYuNTIzLDMxMmMwLjg1NiwwLDEuNjk2LDAuMDcyLDIuNTQ0LDAuMTA0QzM3OC4yMTksMzEyLjA5NiwzNzcuMzc5LDMxMiwzNzYuNTIzLDMxMnoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTI5Ny41NTUsNDA4Yy0wLjUwNC0yLjQ3Mi0wLjg4LTUuMDA4LTEuMTUyLTcuNTg0QzI5Ni42NzUsNDAyLjk5MiwyOTcuMDUxLDQwNS41MjgsMjk3LjU1NSw0MDh6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0yOTkuNDk5LDM2OC40MjRjLTAuNjk2LDIuMjcyLTEuMjk2LDQuNTc2LTEuNzg0LDYuOTI4DQoJCUMyOTguMjE5LDM3My4wMDgsMjk4LjgwMywzNzAuNjg4LDI5OS40OTksMzY4LjQyNHoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTM2OC40ODMsMzEyLjM3NmMxLjYtMC4xNTIsMy4yNzItMC4xOTIsNC45MjgtMC4yNDhjLTEuMzM2LDAuMDQtMi42NjQsMC00LDAuMTM2DQoJCUMzNjkuMDkxLDMxMi4yODgsMzY4Ljc1NSwzMTIuMzUyLDM2OC40ODMsMzEyLjM3NnoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTM2Ni4wMTksMzEyLjY4Yy0xLjYsMC4yMDgtMy4yNDgsMC40NC00Ljg1NiwwLjc0NEMzNjIuNzYzLDMxMy4xMiwzNjQuMzg3LDMxMi44ODgsMzY2LjAxOSwzMTIuNjh6DQoJCSIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiNFMEUwRTI7IiBkPSJNMzI3Ljg1MSwzMjguMmwtMC44NDgsMC42NEwzMjcuODUxLDMyOC4yeiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiNFMEUwRTI7IiBkPSJNNDAwLjA2NywzMTUuNzc2Yy0wLjkxMi0wLjI4OC0xLjgyNC0wLjU2LTIuNzUyLTAuOEMzOTguMjQzLDMxNS4yLDM5OS4xNTUsMzE1LjQ4OCw0MDAuMDY3LDMxNS43NzYNCgkJeiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiNFMEUwRTI7IiBkPSJNMzkzLjM4NywzMTMuOTg0Yy0wLjkzNi0wLjIxNi0xLjg4LTAuNDI0LTIuODMyLTAuNkMzOTEuNTA3LDMxMy42LDM5Mi40NTEsMzEzLjc2OCwzOTMuMzg3LDMxMy45ODQNCgkJeiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiNFMEUwRTI7IiBkPSJNMzg2LjQxOSwzMTIuNzUyYy0wLjkzNi0wLjEyOC0xLjg1Ni0wLjI2NC0yLjc5Mi0wLjM1Mg0KCQlDMzg0LjU2MywzMTIuNDg4LDM4NS40OTEsMzEyLjYyNCwzODYuNDE5LDMxMi43NTJ6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zNTAuNzc5LDMxNi4xMTJjLTAuODgsMC4yODgtMS43MzYsMC42MjQtMi42LDAuOTUyQzM0OS4wNDMsMzE2LjczNiwzNDkuODk5LDMxNi40LDM1MC43NzksMzE2LjExMg0KCQl6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zNTguMTcxLDMxNC4wNTZjLTEuMjk2LDAuMjk2LTIuNTY4LDAuNjI0LTMuODQsMC45ODQNCgkJQzM1NS42MDMsMzE0LjY4OCwzNTYuODc1LDMxNC4zNTIsMzU4LjE3MSwzMTQuMDU2eiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiNFMEUwRTI7IiBkPSJNMzIyLjk1NSwzMzIuMmwtMS4zNzYsMS4yNTZMMzIyLjk1NSwzMzIuMnoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTQxOC40NTEsMzI0LjI5NmMtMC42MjQtMC4zOTItMS4yNzItMC43MzYtMS45MDQtMS4xMTINCgkJQzQxNy4xNzksMzIzLjU2LDQxNy44MjcsMzIzLjkwNCw0MTguNDUxLDMyNC4yOTZ6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zMDIuMTc5LDM2MS4wNTZjLTAuOTUyLDIuMjU2LTEuOCw0LjU2OC0yLjUzNiw2LjkyQzMwMC4zODcsMzY1LjYsMzAxLjIyNywzNjMuMzEyLDMwMi4xNzksMzYxLjA1Ng0KCQl6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zMDUuNTU1LDM1My45MzZjLTEuMjA4LDIuMjA4LTIuMjg4LDQuNDg4LTMuMjgsNi44MTYNCgkJQzMwMy4yODMsMzU4LjQxNiwzMDQuMzc2LDM1Ni4xNDQsMzA1LjU1NSwzNTMuOTM2eiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiNFMEUwRTI7IiBkPSJNNDEyLjYxOSwzMjAuOTZjLTAuOC0wLjQtMS42LTAuNzYtMi40LTEuMTM2QzQxMS4wNDMsMzIwLjIsNDExLjg0MywzMjAuNTYsNDEyLjYxOSwzMjAuOTZ6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zMTMuNzYzLDM0MS43NTJjLTMuMDc2LDMuNzc4LTUuNzk5LDcuODMtOC4xMzYsMTIuMTA0DQoJCUMzMDcuOTY1LDM0OS41ODIsMzEwLjY4OCwzNDUuNTMxLDMxMy43NjMsMzQxLjc1MnoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTQwNi40ODMsMzE4LjExMmMtMC44NTYtMC4zNTItMS43MjgtMC42OC0yLjYtMS4wMDgNCgkJQzQwNC43NTUsMzE3LjQzMiw0MDUuNjI3LDMxNy43Niw0MDYuNDgzLDMxOC4xMTJ6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zMTYuMjUxLDMzOC45MDRjMC42NC0wLjcyOCwxLjI4OC0xLjQ1NiwxLjk2LTIuMTYNCgkJQzMxNy41NTUsMzM3LjQ0OCwzMTYuODk5LDMzOC4xNzYsMzE2LjI1MSwzMzguOTA0eiIvPg0KPC9nPg0KPHBhdGggc3R5bGU9ImZpbGw6I0ZGNTAyMzsiIGQ9Ik00MjMuOTU1LDMyOC4wOGMtMS43NzYtMS4zMzYtMy42MTYtMi41OTItNS41MDQtMy43ODRjLTAuNjI0LTAuMzkyLTEuMjcyLTAuNzM2LTEuOTA0LTEuMTEyDQoJYy0xLjI5Ni0wLjgtMi41OTItMS41MjgtMy45MjgtMi4yMjRjLTAuOC0wLjQtMS42LTAuNzYtMi40LTEuMTM2Yy0xLjI0LTAuNi0yLjQ4OC0xLjE3Ni0zLjc2OC0xLjcxMg0KCWMtMC44NTYtMC4zNTItMS43MjgtMC42OC0yLjYtMS4wMDhjLTEuMjY0LTAuNDcyLTIuNTI4LTAuOTItMy44MTYtMS4zMjhjLTAuOTEyLTAuMjg4LTEuODI0LTAuNTYtMi43NTItMC44DQoJYy0xLjI5Ni0wLjM2LTIuNjA4LTAuNjgtMy45MjgtMC45NzZjLTAuOTM2LTAuMjE2LTEuODgtMC40MjQtMi44MzItMC42Yy0xLjM2OC0wLjI0OC0yLjc1Mi0wLjQ0OC00LjEzNi0wLjYzMg0KCWMtMC45MjgtMC4xMjgtMS44NTYtMC4yNjQtMi43OTItMC4zNTJjLTEuNTA0LTAuMTQ0LTMuMDMyLTAuMjE2LTQuNTYtMC4yNzJjLTAuODQ4LDAtMS42ODgtMC4wOTYtMi41NDQtMC4xMDQNCgljLTEuMDMyLDAtMi4wOCwwLjA3Mi0zLjExMiwwLjEwNGMtMS42NTYsMC4wNTYtMy4zMDQsMC4wOTYtNC45MjgsMC4yNDhjLTAuOCwwLjA4LTEuNjQsMC4yLTIuNDY0LDAuMzA0DQoJYy0xLjYsMC4yMDgtMy4yNTYsMC40NC00Ljg1NiwwLjc0NGMtMSwwLjE5Mi0yLDAuNC0yLjk5MiwwLjYzMmMtMS4yOTYsMC4yOTYtMi41NjgsMC42MzItMy44NCwwLjk4NHMtMi40LDAuNjgtMy41NTIsMS4wNzINCgljLTAuODgsMC4yODgtMS43MzYsMC42MjQtMi42LDAuOTUyYy03LjI3NiwyLjcxNS0xNC4xMjMsNi40NjYtMjAuMzI4LDExLjEzNmwtMC44NDgsMC42NGMtMS4zOTIsMS4wNzItMi43MjgsMi4yLTQuMDQ4LDMuMzYNCglsLTEuMzc2LDEuMjU2Yy0xLjE1MiwxLjA2NC0yLjI4LDIuMTYtMy4zNjgsMy4yODhjLTAuNjcyLDAuNzA0LTEuMzIsMS40MzItMS45NiwyLjE2Yy0wLjgsMC45MzYtMS42OTYsMS44NzItMi40ODgsMi44NDgNCgljLTMuMDc1LDMuNzc5LTUuNzk4LDcuODMtOC4xMzYsMTIuMTA0bC0wLjA0LDAuMDhjLTEuMiwyLjIwOC0yLjI5Myw0LjQ4LTMuMjgsNi44MTZsLTAuMTI4LDAuMzA0DQoJYy0wLjk1MiwyLjI1Ni0xLjc5Miw0LjU2OC0yLjUzNiw2LjkybC0wLjE0NCwwLjQ0OGMtMC42OTYsMi4yNjQtMS4yOCw0LjU4NC0xLjc4NCw2LjkyOGMtMC4wNDgsMC4yNjQtMC4xMiwwLjUyLTAuMTc2LDAuOA0KCWMtMC4zNDQsMS43MzYtMC41NjgsMy41Mi0wLjgsNS4yOTZjLTAuMTI4LDEuMDMyLTAuMzA0LDIuMDgtMC40LDMuMTA0Yy0wLjE0NCwxLjYtMC4xODQsMy4yLTAuMjQsNC43NTINCgljMCwxLjA4OC0wLjExMiwyLjE5Mi0wLjEwNCwzLjI3MmMwLDEuNzkyLDAuMTM2LDMuNTQ0LDAuMjY0LDUuMjk2YzAuMDY0LDAuODQ4LDAuMDY0LDEuNzIsMC4xNTIsMi41Ng0KCWMwLjI3MiwyLjU3NiwwLjY0OCw1LjExMiwxLjE1Miw3LjU4NGM4LjgyNSw0My4yOTIsNTEuMDc1LDcxLjIzNCw5NC4zNjcsNjIuNDA5YzQzLjI5Mi04LjgyNSw3MS4yMzQtNTEuMDc1LDYyLjQwOS05NC4zNjcNCglDNDUwLjM5OSwzNTYuOTAzLDQzOS42MDEsMzM5LjgyOCw0MjMuOTU1LDMyOC4wOEw0MjMuOTU1LDMyOC4wOHogTTQwNy41NTUsNDIzLjZsLTMxLjYtMzEuNmwtMzEuNiwzMS42bDMxLjYtMzEuNmwtMzEuNi0zMS42DQoJbDMxLjYsMzEuNmwzMS42LTMxLjZsLTMxLjYsMzEuNkw0MDcuNTU1LDQyMy42eiIvPg0KPGc+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0yOTYuMjUxLDM5Ny44NTZjLTAuMTI4LTEuNzUyLTAuMjU2LTMuNTA0LTAuMjY0LTUuMjk2YzAtMC4xOTIsMC0wLjM2OCwwLTAuNTYNCgkJYzAtMC45MTIsMC4xMDQtMS44LDAuMTM2LTIuNzEyYzAuMDU2LTEuNiwwLjA5Ni0zLjE1MiwwLjI0LTQuNzUyYzAuMDk2LTEuMDQ4LDAuMjY0LTIuMDcyLDAuNC0zLjEwNGMwLjE3Ni0xLjMyOCwwLjI4LTIuNjQsMC41Mi00DQoJCWMwLjA4LTAuNDQ4LDAuMi0wLjg3MiwwLjI4OC0xLjMyYzAuMDU2LTAuMjY0LDAuMTItMC41MiwwLjE3Ni0wLjhjMC40ODgtMi4zNTIsMS4wODgtNC42NTYsMS43ODQtNi45MjhsMC4xMTItMC4zODQNCgkJYzAuNzM2LTIuMzUyLDEuNi00LjY2NCwyLjUzNi02LjkybDAuMTI4LTAuMzA0YzAuOTkyLTIuMzI4LDIuMDcyLTQuNjA4LDMuMjgtNi44MTZsMC4wNC0wLjA4YzIuMzM3LTQuMjc0LDUuMDYtOC4zMjYsOC4xMzYtMTIuMTA0DQoJCWMwLjgtMC45ODQsMS42NDgtMS45MTIsMi40ODgtMi44NDhjMC42NDgtMC43MjgsMS4yODgtMS40NTYsMS45Ni0yLjE2YzEuMDg4LTEuMTM2LDIuMjE2LTIuMjE2LDMuMzY4LTMuMjg4bDEuMzc2LTEuMjU2DQoJCWMxLjMxMi0xLjE2LDIuNjU2LTIuMjg4LDQuMDQ4LTMuMzZsMC44NDgtMC42NGM2LjE5Ny00LjY4MywxMy4wNDUtOC40MzUsMjAuMzI4LTExLjEzNmMwLjg2NC0wLjMyOCwxLjcyLTAuNjY0LDIuNi0wLjk1Mg0KCQljMS4xNjgtMC4zOTIsMi40LTAuNzM2LDMuNTUyLTEuMDcyczIuNTQ0LTAuNjg4LDMuODQtMC45ODRjMC45OTItMC4yMjQsMS45ODQtMC40NCwyLjk5Mi0wLjYzMmMxLjYtMC4zMDQsMy4yLTAuNTM2LDQuODU2LTAuNzQ0DQoJCWMwLjgtMC4xMDQsMS42LTAuMjI0LDIuNDY0LTAuMzA0YzAuMzA0LDAsMC42MDgtMC4wODgsMC45MTItMC4xMTJjMS4zNTItMC4xMTIsMi42OC0wLjA5Niw0LTAuMTM2DQoJCWMwLjg0OCwwLDEuNjg4LTAuMTI4LDIuNTQ0LTAuMTI4aDAuNTY4YzAuODU2LDAsMS42OTYsMC4wNzIsMi41NDQsMC4xMDRjMS41MjgsMC4wNjQsMy4wNTYsMC4xMjgsNC41NiwwLjI3Mg0KCQljMC45MzYsMC4wODgsMS44NTYsMC4yMjQsMi43OTIsMC4zNTJjMS4zODQsMC4xODQsMi43NjgsMC4zODQsNC4xMzYsMC42MzJjMC45NTIsMC4xNzYsMS44OTYsMC4zODQsMi44MzIsMC42DQoJCWMxLjMyLDAuMjk2LDIuNjMyLDAuNjE2LDMuOTI4LDAuOTc2YzAuOTI4LDAuMjU2LDEuODQsMC41MjgsMi43NTIsMC44YzEuMjg4LDAuNDA4LDIuNTUyLDAuODU2LDMuODE2LDEuMzI4DQoJCWMwLjg3MiwwLjMyOCwxLjc0NCwwLjY1NiwyLjYsMS4wMDhjMS4yOCwwLjUzNiwyLjUyOCwxLjExMiwzLjc2OCwxLjcxMmMwLjgsMC4zNzYsMS42LDAuNzM2LDIuNCwxLjEzNg0KCQljMS4zMzYsMC42OTYsMi42MzIsMS40NTYsMy45MjgsMi4yMjRjMC42MzIsMC4zNzYsMS4yOCwwLjcyLDEuOTA0LDEuMTEyYzEuODg4LDEuMTkyLDMuNzI4LDIuNDQ4LDUuNTA0LDMuNzg0VjI0DQoJCWMwLTguODM3LTcuMTYzLTE2LTE2LTE2SDM5Ljk1NWMtOC44MzcsMC0xNiw3LjE2My0xNiwxNnYzNjhjMCw4LjgzNyw3LjE2MywxNiwxNiwxNmgyNTcuNmMtMC41MDQtMi40NzItMC44OC01LjAwOC0xLjE1Mi03LjU4NA0KCQlDMjk2LjMxNSwzOTkuNTc2LDI5Ni4zMTUsMzk4LjcwNCwyOTYuMjUxLDM5Ny44NTZMMjk2LjI1MSwzOTcuODU2eiBNMjcxLjk1NSwyOTZoLTk2di0zMmgtMzJ2LTMyaC00OFY3MmgyNTZ2MTYwaC00OHYzMmgtMzJWMjk2eiINCgkJLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTM0OC4xNzksMzE3LjA2NGMtNy4yODMsMi43MDEtMTQuMTMxLDYuNDUzLTIwLjMyOCwxMS4xMzYNCgkJQzMzNC4wNTYsMzIzLjUzLDM0MC45MDMsMzE5Ljc3OSwzNDguMTc5LDMxNy4wNjR6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zOTcuMzE1LDMxNC45NmMtMS4yOTYtMC4zNi0yLjYwOC0wLjY4LTMuOTI4LTAuOTc2QzM5NC43MDcsMzE0LjI4LDM5Ni4wMTksMzE0LjYsMzk3LjMxNSwzMTQuOTZ6Ig0KCQkvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiNFMEUwRTI7IiBkPSJNMzU0LjM1NSwzMTUuMDRjLTEuMTkyLDAuMzM2LTIuNCwwLjY4LTMuNTUyLDEuMDcyQzM1MS45NTUsMzE1LjcyLDM1My4xMzksMzE1LjM4NCwzNTQuMzU1LDMxNS4wNHoNCgkJIi8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zNjguNDgzLDMxMi4zNzZjLTAuOCwwLjA4LTEuNjQsMC4yLTIuNDY0LDAuMzA0QzM2Ni44NDMsMzEyLjU3NiwzNjcuNjUxLDMxMi40NTYsMzY4LjQ4MywzMTIuMzc2eg0KCQkiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTI5Ni4yNTEsMzk3Ljg1NmMwLjA2NCwwLjg0OCwwLjA2NCwxLjcyLDAuMTUyLDIuNTYNCgkJQzI5Ni4zMTUsMzk5LjU3NiwyOTYuMzE1LDM5OC43MDQsMjk2LjI1MSwzOTcuODU2eiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiNFMEUwRTI7IiBkPSJNMzkwLjU1NSwzMTMuMzg0Yy0xLjM2OC0wLjI0OC0yLjc1Mi0wLjQ0OC00LjEzNi0wLjYzMg0KCQlDMzg3LjgwMywzMTIuOTM2LDM4OS4xODcsMzEzLjEzNiwzOTAuNTU1LDMxMy4zODR6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zODMuNjI3LDMxMi40Yy0xLjUwNC0wLjE0NC0zLjAzMi0wLjIwOC00LjU2LTAuMjcyQzM4MC41OTUsMzEyLjE4NCwzODIuMTIzLDMxMi4yNTYsMzgzLjYyNywzMTIuNA0KCQl6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik00MTYuNTQ3LDMyMy4yYy0xLjI5Ni0wLjgtMi41OTItMS41MjgtMy45MjgtMi4yMjRDNDEzLjk1NSwzMjEuNjU2LDQxNS4yNTEsMzIyLjQsNDE2LjU0NywzMjMuMnoiDQoJCS8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zMDIuMzA3LDM2MC43NTJsLTAuMTI4LDAuMzA0TDMwMi4zMDcsMzYwLjc1MnoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTI5NS45NTUsMzkyLjU2YzAtMS4wOCwwLjA3Mi0yLjE4NCwwLjEwNC0zLjI3MmMwLDAuOTEyLTAuMTM2LDEuOC0wLjEzNiwyLjcxMg0KCQlDMjk1Ljk1NSwzOTIuMTkyLDI5NS45NTUsMzkyLjM2OCwyOTUuOTU1LDM5Mi41NkwyOTUuOTU1LDM5Mi41NnoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTQxMC4yNTEsMzE5LjgyNGMtMS4yNC0wLjYtMi40ODgtMS4xNzYtMy43NjgtMS43MTJDNDA3Ljc2MywzMTguNjQ4LDQwOS4wMTEsMzE5LjIsNDEwLjI1MSwzMTkuODI0DQoJCXoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTQwMy44ODMsMzE3LjEwNGMtMS4yNjQtMC40NzItMi41MjgtMC45Mi0zLjgxNi0xLjMyOA0KCQlDNDAxLjM1NSwzMTYuMTg0LDQwMi42MTksMzE2LjYzMiw0MDMuODgzLDMxNy4xMDR6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zMTYuMjUxLDMzOC45MDRjLTAuOCwwLjkzNi0xLjY5NiwxLjg2NC0yLjQ4OCwyLjg0OEMzMTQuNTU1LDM0MC44LDMxNS40MTEsMzM5Ljg0LDMxNi4yNTEsMzM4LjkwNA0KCQl6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zMjcuMDAzLDMyOC44NGMtMS4zOTIsMS4wNzItMi43MzYsMi4yLTQuMDQ4LDMuMzZDMzI0LjI3NSwzMzEuMDQsMzI1LjYxMSwzMjkuOTEyLDMyNy4wMDMsMzI4Ljg0eg0KCQkiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTMwNS42MjcsMzUzLjg1NmwtMC4wNCwwLjA4TDMwNS42MjcsMzUzLjg1NnoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTI5Ny43MTUsMzc1LjM1MmMtMC4wNTYsMC4yNjQtMC4xMiwwLjUyLTAuMTc2LDAuOA0KCQlDMjk3LjU5NSwzNzUuODcyLDI5Ny42NjcsMzc1LjYxNiwyOTcuNzE1LDM3NS4zNTJ6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik00MjMuOTU1LDMyOC4wOGMtMS43NzYtMS4zMzYtMy42MTYtMi41OTItNS41MDQtMy43ODQNCgkJQzQyMC4zMzksMzI1LjQ4OCw0MjIuMTc5LDMyNi43NDQsNDIzLjk1NSwzMjguMDh6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0yOTkuNjQzLDM2OGwtMC4xNDQsMC40NDhMMjk5LjY0MywzNjh6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zMTguMjExLDMzNi43NDRjMS4wODgtMS4xMjgsMi4yMTYtMi4yMjQsMy4zNjgtMy4yODgNCgkJQzMyMC40MjcsMzM0LjUyOCwzMTkuMjk5LDMzNS42MDgsMzE4LjIxMSwzMzYuNzQ0eiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiNFMEUwRTI7IiBkPSJNMzczLjQxMSwzMTIuMTI4YzEuMDMyLDAsMi4wOC0wLjExMiwzLjExMi0wLjEwNGMtMC4xOTIsMC0wLjM3NiwwLTAuNTY4LDANCgkJQzM3NS4wOTksMzEyLDM3NC4yNTksMzEyLjEwNCwzNzMuNDExLDMxMi4xMjh6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6I0UwRTBFMjsiIGQ9Ik0zNjEuMTYzLDMxMy40MjRjLTEuMDA4LDAuMTkyLTIsMC40MDgtMi45OTIsMC42MzJDMzU5LjE1NSwzMTMuODI0LDM2MC4xNjMsMzEzLjYsMzYxLjE2MywzMTMuNDI0eg0KCQkiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojRTBFMEUyOyIgZD0iTTI5Ni43NTUsMzgxLjQzMmMtMC4xMzYsMS4wMzItMC4zMDQsMi4wNTYtMC40LDMuMTA0DQoJCUMyOTYuNDI3LDM4My41MTIsMjk2LjYwMywzODIuNDY0LDI5Ni43NTUsMzgxLjQzMnoiLz4NCjwvZz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNGRkRBNDQ7IiBkPSJNMzAzLjk1NSwyMzJoNDhWNzJoLTMydjY0VjcyaC0zMnY2NFY3MmgtMzJ2NjRWNzJoLTMydjY0VjcyaC0zMnY2NFY3MmgtMzJ2NjRWNzJoLTMydjY0VjcyaC0zMnYxNjANCgloNDh2MzJoMzJ2MzJoOTZ2LTMyaDMyVjIzMnoiLz4NCjxnPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNNDMxLjk1NSwzMjQuMzY4VjI0YzAtMTMuMjU1LTEwLjc0NS0yNC0yNC0yNGgtMzY4Yy0xMy4yNTUsMC0yNCwxMC43NDUtMjQsMjR2MzY4DQoJCWMwLDEzLjI1NSwxMC43NDUsMjQsMjQsMjRoMjUxLjM2OGMxMy4zMTcsNDYuNzQxLDYyLjAwNCw3My44MzcsMTA4Ljc0NSw2MC41MmMzNy43Ny0xMC43NjEsNjMuODM3LTQ1LjI0Nyw2My44ODgtODQuNTINCgkJQzQ2NC4wMjMsMzY1Ljc4Niw0NTIuMjY3LDM0MC45MzksNDMxLjk1NSwzMjQuMzY4TDQzMS45NTUsMzI0LjM2OHogTTM5Ljk1NSw0MDBjLTQuNDE4LDAtOC0zLjU4Mi04LThWMjRjMC00LjQxOCwzLjU4Mi04LDgtOGgzNjgNCgkJYzQuNDE4LDAsOCwzLjU4Miw4LDh2Mjg5LjY1NmwtMC4xNzYtMC4wNzJjLTcuMDI1LTMuNTg5LTE0LjUwOC02LjE5OS0yMi4yNC03Ljc2bC0wLjgtMC4xNjhjLTMuNjk4LTAuNzItNy40NC0xLjE5OC0xMS4yLTEuNDMyDQoJCWMtMC40MjQsMC0wLjg1NiwwLTEuMjgtMC4wNTZjLTEuNDU2LTAuMDY0LTIuODcyLTAuMTY4LTQuMzA0LTAuMTY4Yy0xLjgyNCwwLTMuNjA4LDAuMTY4LTUuNDA4LDAuMjcyYy0wLjYsMC4wNC0xLjE5MiwwLTEuNzg0LDANCgkJYy0wLjMyOCwwLTAuNjQ4LDAuMDg4LTAuOTc2LDAuMTJjLTAuOTc2LDAuMDg4LTEuOTI4LDAuMjMyLTIuODk2LDAuMzZjLTEuNjk2LDAuMjE2LTMuMzg0LDAuNDU2LTUuMDY0LDAuOA0KCQljLTEuMjMyLDAuMjMyLTIuNDQ4LDAuNTA0LTMuNjY0LDAuOHMtMi40LDAuNTkyLTMuNTkyLDAuOTJjLTEuNiwwLjQ0LTMuMTIsMC44OTYtNC42NTYsMS40MDhsLTEuNDQsMC41MjgNCgkJYy0xOC43NTksNi43MjctMzQuNjkzLDE5LjU5Ni00NS4yMTYsMzYuNTJjLTAuOCwxLjI4OC0xLjYsMi41NjgtMi40LDMuOTA0Yy0wLjMzNiwwLjYxNi0wLjY0LDEuMjU2LTAuOTY4LDEuODgNCgkJYy0wLjk5MiwxLjg4OC0xLjkyOCwzLjgwOC0yLjc4NCw1Ljc3NmMtMC4xODQsMC40MjQtMC4zNTIsMC44NTYtMC41MjgsMS4yODhjLTAuOTI4LDIuMjEzLTEuNzYsNC40NzUtMi40OTYsNi43ODQNCgkJYy0wLjEwNCwwLjMyOC0wLjIwOCwwLjY0LTAuMzA0LDAuOTY4Yy0wLjczMSwyLjM2OC0xLjM1Miw0Ljc4MS0xLjg2NCw3LjI0Yy0wLjA4LDAuMzY4LTAuMTc2LDAuNzI4LTAuMjQ4LDEuMTA0DQoJCXMtMC4yMzIsMC45MjgtMC4zMTIsMS40Yy0wLjE0NCwwLjgtMC4xNTIsMS42LTAuMjcyLDIuNGMtMC4zOTIsMi41MjgtMC42OCw1LjA3Mi0wLjg1Niw3LjY2NGMtMC4wOCwxLjE5Mi0wLjE0NCwyLjQtMC4xNzYsMy41Ng0KCQljMCwwLjgtMC4xMiwxLjU0NC0wLjEyLDIuMzI4YzAsMi4wNzIsMC4xNjgsNC4xNDQsMC4zMTIsNi4yMTZ2MS43ODRMMzkuOTU1LDQwMHogTTM3NS45NTUsNDY0DQoJCWMtMzQuMTg1LTAuMDgzLTYzLjYzLTI0LjEyMy03MC41NTItNTcuNmMtMC40NzgtMi4zMjktMC44MzYtNC42ODItMS4wNzItNy4wNDhjLTAuMDQ4LTAuNDgsMC0wLjk2LTAuMDgtMS40NA0KCQljLTAuMTUyLTEuODcyLTAuMjcyLTMuNzUyLTAuMjgtNS42YzAtMC43MzYsMC4wNjQtMS40OCwwLjA4LTIuMjE2YzAuMDQ4LTEuNjY0LDAuMDk2LTMuMzI4LDAuMjU2LTQuOTYNCgkJYzAuMDY0LTAuNzM2LDAuMTkyLTEuNDcyLDAuMjg4LTIuMjA4YzAuMjI0LTEuNzY4LDAuNDU2LTMuNTQ0LDAuOC01LjI3MmMwLTAuMTI4LDAuMDU2LTAuMjU2LDAuMDg4LTAuMzg0DQoJCWMwLjQ2NC0yLjIzMiwxLjAyNC00LjQzMiwxLjY5Ni02LjU4NHYtMC4xMTJjMC42ODgtMi4xODcsMS40NzItNC4zMiwyLjM1Mi02LjRsMC4wOTYtMC4yMjRjMC44NTYtMi4wMDgsMS44MDgtNCwyLjgzMi01Ljg3Mg0KCQljMC4wOC0wLjE1MiwwLjE1Mi0wLjMwNCwwLjIzMi0wLjQ0OGMxLjAxNi0xLjg2NCwyLjEyOC0zLjY3MiwzLjMwNC01LjQzMmMwLjczNi0xLjA5NiwxLjUzNi0yLjEzNiwyLjMyOC0zLjINCgkJYzAuNDY0LTAuNjE2LDAuOTEyLTEuMjU2LDEuNC0xLjg2NGMxLjA5Ni0xLjM2LDIuMjU2LTIuNjcyLDMuNDQ4LTMuOTUybDAuNDA4LTAuNDQ4YzcuNzM4LTguMTQzLDE3LjI0LTE0LjQwMiwyNy43NzYtMTguMjk2DQoJCWMwLjU5Mi0wLjIxNiwxLjE3Ni0wLjQ1NiwxLjc3Ni0wLjY1NmMxLjEzNi0wLjM4NCwyLjI4OC0wLjcxMiwzLjQ0LTEuMDRzMi4xOTItMC41OTIsMy4zMDQtMC44NDgNCgkJYzAuOTA0LTAuMjA4LDEuODE2LTAuNDA4LDIuNzM2LTAuNTg0YzEuNDU2LTAuMjcyLDIuOTI4LTAuNDg4LDQuNDE2LTAuNjcyYzAuNzEyLTAuMDg4LDEuNDI0LTAuMiwyLjEzNi0wLjI2NA0KCQljMS41NTItMC4xNDQsMy4xMjgtMC4yLDQuNzA0LTAuMjRjMC44LDAsMS42NTYtMC4wOTYsMi40OC0wLjA4OGMwLjUwNCwwLDAuOTkyLDAuMDQ4LDEuNDg4LDAuMDY0DQoJCWMxLjYsMC4wNCwzLjI3MiwwLjExMiw0Ljg4OCwwLjI3MmMwLjUwNCwwLjA0OCwwLjk5MiwwLjEyLDEuNDg4LDAuMTc2YzEuNiwwLjE5MiwzLjI2NCwwLjQxNiw0Ljg3MiwwLjcyDQoJCWMwLjQ0LDAuMDgsMC44NzIsMC4xNzYsMS4zMTIsMC4yNjRjMS42NDgsMC4zNDQsMy4yODgsMC43MzYsNC45MTIsMS4xOTJsMS4yMDgsMC4zNTJjMS42LDAuNDgsMy4yLDEuMDMyLDQuOCwxLjYNCgkJYzAuNCwwLjE1MiwwLjgsMC4yOTYsMS4yMDgsMC40NTZjMS41MzYsMC42MTYsMy4wNDgsMS4zMDQsNC41NDQsMi4wMjRsMS4yOCwwLjYwOGMxLjQ2NCwwLjc0NCwyLjg4OCwxLjYsNC4yOTYsMi40DQoJCWMwLjQxNiwwLjI0LDAuODQsMC40NjQsMS4yNDgsMC43MmMxLjc3NiwxLjExMiwzLjUxMiwyLjI4OCw1LjE5MiwzLjU2aDAuMDQ4YzE4LjIxNywxMy41MDMsMjguOTE5LDM0Ljg2OSwyOC44MjQsNTcuNTQ0DQoJCUM0NDcuOTExLDQzMS43NDYsNDE1LjcwMSw0NjMuOTU2LDM3NS45NTUsNDY0TDM3NS45NTUsNDY0eiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNMzExLjk1NSwyNDBoNDhWNjRoLTI3MnYxNzZoNDh2MzJoMzJ2MzJoMTEydi0zMmgzMlYyNDB6IE0yOTUuOTU1LDI1NmgtMzJ2MzJoLTgwdi0zMmgtMzJ2LTMyaC00OA0KCQlWODBoMTZ2NTZoMTZWODBoMTZ2NTZoMTZWODBoMTZ2NTZoMTZWODBoMTZ2NTZoMTZWODBoMTZ2NTZoMTZWODBoMTZ2NTZoMTZWODBoMTZ2NTZoMTZWODBoMTZ2MTQ0aC00OFYyNTZ6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzIzMUYyMDsiIGQ9Ik02My45NTUsMzUyaDE2MHYxNmgtMTYwVjM1MnoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojMjMxRjIwOyIgZD0iTTIzOS45NTUsMzUyaDMydjE2aC0zMlYzNTJ6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzIzMUYyMDsiIGQ9Ik00MTMuMjExLDM1NC43NDRjLTMuMTI0LTMuMTIzLTguMTg4LTMuMTIzLTExLjMxMiwwbC0yNS45NDQsMjUuOTQ0bC0yNS45NDQtMjUuOTQ0DQoJCWMtMy4wNy0zLjE3OC04LjEzNC0zLjI2Ni0xMS4zMTItMC4xOTZjLTMuMTc4LDMuMDctMy4yNjYsOC4xMzQtMC4xOTYsMTEuMzEyYzAuMDY0LDAuMDY2LDAuMTI5LDAuMTMyLDAuMTk2LDAuMTk2TDM2NC42NDMsMzkyDQoJCWwtMjUuOTQ0LDI1Ljk0NGMtMy4xNzgsMy4wNy0zLjI2Niw4LjEzNC0wLjE5NiwxMS4zMTJjMy4wNywzLjE3OCw4LjEzNCwzLjI2NiwxMS4zMTIsMC4xOTZjMC4wNjYtMC4wNjQsMC4xMzItMC4xMjksMC4xOTYtMC4xOTYNCgkJbDI1Ljk0NC0yNS45NDRsMjUuOTQ0LDI1Ljk0NGMzLjA3LDMuMTc4LDguMTM0LDMuMjY2LDExLjMxMiwwLjE5NmMzLjE3OC0zLjA3LDMuMjY2LTguMTM0LDAuMTk2LTExLjMxMg0KCQljLTAuMDY0LTAuMDY2LTAuMTI5LTAuMTMyLTAuMTk2LTAuMTk2TDM4Ny4yNjcsMzkybDI1Ljk0NC0yNS45NDRDNDE2LjMzNCwzNjIuOTMyLDQxNi4zMzQsMzU3Ljg2OCw0MTMuMjExLDM1NC43NDR6Ii8+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==';","import { Injectable } from '@angular/core';\r\nimport { AllLanguages, Languages } from '../interfaces';\r\nimport { Lang_Deutsch } from '../languages/de.lang';\r\nimport { Lang_English } from '../languages/en.lang';\r\nimport { Lang_Spanish } from '../languages/es.lang';\r\n\r\n@Injectable()\r\nexport class LanguageService {\r\n    languagesDict: AllLanguages = {\r\n        'en': Lang_English,\r\n        'de': Lang_Deutsch,\r\n        'es': Lang_Spanish\r\n    };\r\n\r\n    language: Languages;\r\n\r\n    constructor() {\r\n    }\r\n\r\n    getLanguage() {\r\n        return this.language;\r\n    }\r\n    getLanguageDict() {\r\n        return this.languagesDict;\r\n    }\r\n}\r\n","import { Inject, Pipe, PipeTransform } from '@angular/core';\r\nimport { Language, NgxNetworkErrorConfiguration } from '../interfaces';\r\nimport { LanguageService } from '../services/language.service'\r\nimport { GlobalConfig } from '../tokens';\r\n\r\n/**\r\n * Pipe to automatically translate a string using languages dictionary\r\n */\r\n@Pipe({\r\n  name: 'translate'\r\n})\r\nexport class TranslatePipe implements PipeTransform {\r\n\r\n  constructor(\r\n    @Inject(GlobalConfig) private readonly globalConfig: NgxNetworkErrorConfiguration,\r\n    private languageService: LanguageService\r\n  ) { }\r\n\r\n  transform(key: keyof Language): string {\r\n    if (!key) return '';\r\n    console.log(key)\r\n    // Get current language\r\n    const language = this.languageService.language || this.globalConfig.language;\r\n    // Get messages of given language and error type\r\n    const messages = this.languageService.languagesDict[language][key];\r\n    if (!messages) return 'Error message not found!' // Message code not implemented in language\r\n    if (Array.isArray(messages)) {\r\n      // Pick random error message\r\n      return messages[Math.floor(Math.random() * messages.length)]\r\n    } else {\r\n      // Get the only one message\r\n      return messages;\r\n    }\r\n  }\r\n\r\n}\r\n","import { ApplicationRef, ChangeDetectionStrategy, Component, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { DomSanitizer, SafeStyle } from '@angular/platform-browser';\r\nimport { NetworkError, NgxNetworkErrorConfiguration } from '../interfaces';\r\nimport { NetworkErrorService } from '../services/utility.service';\r\nimport { Error4xxSVG, Error5xxSVG, NetworkSVG, ParseSVG } from '../svgs';\r\nimport { GlobalConfig } from '../tokens';\r\nimport { showReportDialog } from '@sentry/browser';\r\n\r\n@Component({\r\n  selector: 'app-error',\r\n  templateUrl: 'error.dialog.html',\r\n  styleUrls: ['./error.dialog.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ErrorDialog {\r\n\r\n  constructor(\r\n    public dialogRef: MatDialogRef<ErrorDialog>,\r\n    @Inject(MAT_DIALOG_DATA) public error: NetworkError,\r\n    @Inject(GlobalConfig) public readonly globalConfig: NgxNetworkErrorConfiguration,\r\n    private sanitizer: DomSanitizer,\r\n    public utilityService: NetworkErrorService,\r\n    private _ref: ApplicationRef\r\n  ) {\r\n    // Get and sanitize dialog icon\r\n    this.icon = this.sanitizer.bypassSecurityTrustStyle(`url(${this.iconDict[error.icon]})`);\r\n    // Decide wether or not to show contacts based on the following error types\r\n    const errorsWithContact: NetworkError['messageCode'][] = ['Bad_Content', 'Bad_Headers', 'Status_5xx', 'Status_403', 'Status_404'];\r\n    this.showContacts = errorsWithContact.includes(error.messageCode);\r\n    // Re-run change detection, this is because when error dialog is shown in App initialization,\r\n    //  automatic change detection fails to render HTML\r\n    this._ref.tick()\r\n  }\r\n\r\n  /* Wether or not to show contacts, assigned in constructor */\r\n  showContacts: boolean;\r\n\r\n  // Dictionary of error images\r\n  iconDict = {\r\n    '4xx': Error4xxSVG,\r\n    '5xx': Error5xxSVG,\r\n    parse: ParseSVG,\r\n    network: NetworkSVG\r\n  };\r\n\r\n  /** Open the Sentry Feedback dialog */\r\n  openSentryDialog() {\r\n    showReportDialog({ eventId: this.utilityService.sentryEventId })\r\n    this.dialogRef.close();\r\n  }\r\n\r\n  icon: SafeStyle;\r\n\r\n  /** Reload current window */\r\n  reload(): void {\r\n    window.location.reload();\r\n  }\r\n\r\n}\r\n","<ng-container *ngIf=\"error.reload; else normalDialog\">\r\n  <!-- Session expired dialog -->\r\n  <h2 mat-dialog-title>{{ 'ErrorDialog_session_expired' | translate }}</h2>\r\n  <div mat-dialog-content>\r\n    <div class=\"icon cookies-expired\"></div>\r\n    <p>{{ 'ErrorDialog_please_reload' | translate }}</p>\r\n  </div>\r\n  <div mat-dialog-actions>\r\n    <button mat-button color=\"primary\" (click)=\"reload()\">{{ 'ErrorDialog_reload_btn' | translate }}</button>\r\n  </div>\r\n</ng-container>\r\n<ng-template #normalDialog>\r\n  <div mat-dialog-content>\r\n    <!-- Error Icon -->\r\n    <div class=\"icon oops\" [style.backgroundImage]=\"icon\"></div>\r\n    <!-- Oops title -->\r\n    <div class=\"title\">{{ 'ErrorDialog_oops' | translate }}</div>\r\n    <!-- Error Message -->\r\n    <p *ngIf=\"error.messageCode as code\">{{ code | translate }}</p>\r\n    <!-- Show contacts -->\r\n    <ng-container *ngIf=\"showContacts && globalConfig?.contacts?.length > 0\">\r\n      <p>{{ 'ErrorDialog_contacts' | translate }}:</p>\r\n      <div class=\"contacts\">\r\n        <div class=\"contact\" *ngFor=\"let contact of globalConfig.contacts\">\r\n          <div *ngIf=\"contact.name as name\" class=\"name\">\r\n            <b>{{ 'ErrorDialog_contact_name' | translate }}:</b>\r\n            <span>{{ name }}</span>\r\n          </div>\r\n          <div *ngIf=\"contact.email as email\" class=\"email\">\r\n            <b>{{ 'ErrorDialog_contact_email' | translate }}:</b>\r\n            <span>{{ email }}</span>\r\n          </div>\r\n          <div *ngIf=\"contact.telephone as tel\" class=\"telephone\">\r\n            <b>{{ 'ErrorDialog_contact_telephone' | translate }}:</b>\r\n            <span>{{ tel }}</span>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </ng-container>\r\n    <!-- Show call to action or email sended info -->\r\n    <p *ngIf=\"error.email; else contactAdmin\">\r\n      {{ 'ErrorDialog_email_sended' | translate }}\r\n    </p>\r\n    <ng-template #contactAdmin>\r\n      <p>{{ 'ErrorDialog_administrator' | translate }}</p>\r\n    </ng-template>\r\n    <button *ngIf=\"utilityService.sentryEventId\" color=\"primary\" mat-stroked-button (click)=\"openSentryDialog()\">Leave feedback</button>\r\n  </div>\r\n  <div mat-dialog-actions>\r\n    <button mat-button color=\"primary\" mat-dialog-close mat-dialog-close>{{ 'ErrorDialog_close_btn' | translate }}</button>\r\n  </div>\r\n</ng-template>","import { HttpErrorResponse, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { Inject, Injectable, NgZone } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Subject } from 'rxjs';\r\nimport { ErrorDialog } from '../dialog/error.dialog';\r\nimport { DialogIds, KeyValueObject, NetworkError, NgxNetworkErrorConfiguration, RequestParams } from '../interfaces';\r\nimport { GlobalConfig } from '../tokens';\r\n\r\n@Injectable()\r\nexport class NetworkCheckService {\r\n\r\n    constructor(\r\n        private dialog: MatDialog,\r\n        @Inject(GlobalConfig) readonly globalConfig: NgxNetworkErrorConfiguration,\r\n        private ngZone: NgZone\r\n    ) { }\r\n\r\n    /**\r\n     * Object containing the Request Params for the current executing request\r\n     */\r\n    requestConfig: RequestParams;\r\n\r\n    /** Wrapped Function used for Interceptor Handling */\r\n    public handleResponseChecks(params: RequestParams, request: HttpRequest<any>, response: HttpResponse<any>) {\r\n        // Iterate over each sanity check\r\n        for (const test in params.contentChecks) {\r\n            switch (test) {\r\n                case 'headers':\r\n                    // Header sanity check\r\n                    this.CheckHeaders(request, response, params.contentChecks[test]);\r\n                    break;\r\n                case 'match':\r\n                    // Match sanity check\r\n                    this.MatchContent(request, response, params.contentChecks[test]);\r\n                    break;\r\n                case 'shouldMatchContentType':\r\n                    // Matching response sanity check\r\n                    this.CheckContent(request, response);\r\n                    break;\r\n                default:\r\n            }\r\n        }\r\n    }\r\n\r\n    /** Generic function to finalize check with throwing error */\r\n    public handleCheckError(error: NetworkError, force: boolean = false) {\r\n        // Debug RequestParams\r\n        if (this.globalConfig.debug) console.log('RequestConfig:', this.requestConfig);\r\n        /** Prevent Error dialog from openning if:\r\n          *   • We are in a cognos application and session is expired or not found\r\n          *   • Global silent option is provided\r\n          */\r\n        const preventDialog = \r\n            (error.reload && this.globalConfig.authType === 'cognos') ||\r\n            (this.globalConfig && this.globalConfig.silent) ||\r\n            (this.requestConfig && this.requestConfig.silent)\r\n        const errorDialogExists = this.dialog.getDialogById(DialogIds.Error);\r\n        if ((!preventDialog || force) && !errorDialogExists) {\r\n            // Open Error dialog\r\n            this.ngZone.run(() => {\r\n                this.dialog.open(ErrorDialog, {\r\n                    id: DialogIds.Error,\r\n                    panelClass: 'error-dialog',\r\n                    backdropClass: ['error-backdrop', 'cdk-overlay-dark-backdrop'],\r\n                    data: error,\r\n                    autoFocus: false,\r\n                    disableClose: error.reload\r\n                });\r\n            })\r\n        }\r\n        // Send error object to error stream for user use\r\n        this.errorStream.next(error);\r\n        // Throw error in interceptor chain\r\n        throw(error);\r\n    }\r\n\r\n    /** Private stream for internal plugin usage */\r\n    errorStream = new Subject<NetworkError>();\r\n\r\n    /**\r\n     * Check response status code. Throw exception error if status code is not >=200 and <300\r\n     *\r\n     * @param response          An HttpErrorResponse object containing data about the XHR\r\n     * @return void\r\n     */\r\n    public CheckStatusCode(request: HttpRequest<any>, response: HttpErrorResponse): void {\r\n        // message depending on the status code\r\n        let msg = '';\r\n        let icon = '';\r\n        let msgCode: NetworkError['messageCode'] = 'Unknown';\r\n        // switch case over the status code\r\n        switch (response.status.toString()[0]) {\r\n            case '0': // unknown error\r\n                icon = 'network';\r\n                msg = 'Network Error';\r\n                msgCode = 'Status_0';\r\n                break;\r\n            case '2':\r\n                msg = 'OK';\r\n                break;\r\n            case '4':\r\n                // another switch case for specific status codes\r\n                icon = '4xx';\r\n                switch (response.status) {\r\n                    case 400:\r\n                        msg = 'Bad Request';\r\n                        msgCode = 'Status_400';\r\n                        break;\r\n                    case 401:\r\n                        msg = 'Unauthorized';\r\n                        msgCode = 'Status_401_441';\r\n                        break;\r\n                    case 403:\r\n                        msg = 'Forbidden';\r\n                        msgCode = 'Status_403';\r\n                        break;\r\n                    case 404:\r\n                        msg = 'Not Found';\r\n                        msgCode = 'Status_404';\r\n                        break;\r\n                    case 408:\r\n                        msg = 'Request Timeout';\r\n                        msgCode = 'Status_408';\r\n                        break;\r\n                    case 410:\r\n                        msg = 'Gone';\r\n                        msgCode = 'Status_410';\r\n                        break;\r\n                    case 415:\r\n                        msg = 'Unsupported Media Type';\r\n                        msgCode = 'Status_415';\r\n                        break;\r\n                    case 441:\r\n                        msg = 'Unauthorized';\r\n                        msgCode = 'Status_401_441';\r\n                        break;\r\n                    default: // unknown client error\r\n                        msg = 'Unknown Client Error';\r\n                        break;\r\n                }\r\n                break;\r\n            case '5':\r\n                icon = '5xx';\r\n                msgCode = 'Status_5xx';\r\n                // another switch case for specific status codes\r\n                switch (response.status) {\r\n                    case 500:\r\n                        msg = 'Internal Server Error';\r\n                        msgCode = 'Status_500';\r\n                        break;\r\n                    case 501:\r\n                        msg = 'Not Implemented';\r\n                        msgCode = 'Status_501';\r\n                        break;\r\n                    case 502:\r\n                        msg = 'Bad Gateway';\r\n                        msgCode = 'Status_502';\r\n                        break;\r\n                    case 503:\r\n                        msg = 'Service Unavailable';\r\n                        msgCode = 'Status_503';\r\n                        break;\r\n                    case 504:\r\n                        msg = 'Gateway Timeout';\r\n                        msgCode = 'Status_504';\r\n                        break;\r\n                    default: // unknown server error\r\n                        msg = 'Unknown Server Error';\r\n                        break;\r\n                }\r\n                break;\r\n            default:\r\n                icon = 'network';\r\n                msg = 'Unknown Error';\r\n                break;\r\n        }\r\n\r\n        // any >=200 and <300 status code return True else False\r\n        const returnCode = response.status.toString()[0] === '2';\r\n\r\n        // if returnCode is False throw an exception about the error\r\n        if (!returnCode) {\r\n            const error: NetworkError = {\r\n                msg,\r\n                type: 'status',\r\n                messageCode: msgCode,\r\n                info: {\r\n                    response: response,\r\n                    request: request\r\n                },\r\n                icon,\r\n                reload: [401, 403, 441].includes(response.status),\r\n                email: response.status.toString()[0] === '5'\r\n            };\r\n            this.handleCheckError(error);\r\n        }\r\n    }\r\n    \r\n    /**\r\n     * Check headers values in response headers.\r\n     *\r\n     * @param response          An HTTPResponse object containing data about the XHR\r\n     * @param headersToCheck    An key,value pair object containing the key and value to match in response headers\r\n     * @return Boolean, true if headersToCheck are in response else false\r\n     */\r\n    public CheckHeaders(request: HttpRequest<any>, response: HttpResponse<any>, headersToCheck: KeyValueObject): void {\r\n        // message depending on the error encountered\r\n        let msg = '';\r\n        // get all the response headers\r\n        const responseHeaders = response.headers; // should be an HttpHeaders object\r\n        // loop over all the headersToCheck\r\n        for ( const key in headersToCheck ) {\r\n            if (headersToCheck[key]) {\r\n                // get the value from the key\r\n                const value = headersToCheck[key];\r\n                // check if key exists in response headers\r\n                if ( !responseHeaders.has(key) ){\r\n                    msg = `${key} not found in Response Headers`;\r\n                    break;\r\n                } else {\r\n                    // check the value for the key in response headers\r\n                    if ( !responseHeaders.get(key).includes(value) ) {\r\n                        msg = `${value} does not match the one in Response Headers`;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        // if msg is not empty throw an exception about the error\r\n        if (msg !== '') {\r\n            const error: NetworkError = {\r\n                msg,\r\n                messageCode: 'Bad_Headers',\r\n                type: 'headers',\r\n                info: {\r\n                    response: response,\r\n                    request: request\r\n                },\r\n                icon: 'parse',\r\n                reload: false,\r\n                email: true\r\n            };\r\n            this.handleCheckError(error);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Parse the response body depending on the Content-Type,\r\n     * throw exception if Content-Type and response body does not match\r\n     *\r\n     * @param response          An HTTPResponseBase object containing data about the XHR\r\n     * @return void\r\n     */\r\n    public CheckContent(request: HttpRequest<any>, response: HttpResponse<any>): void {\r\n        // message depending on the error encountered\r\n        let msg = '';\r\n        // get the content from the response\r\n        const body = response.body;\r\n        // get all the response headers\r\n        const responseHeaders = response.headers; // should be an HttpHeaders object\r\n        // get the content type for the response\r\n        const contentType = responseHeaders.get('Content-Type');\r\n        // split content type from / and get the last value\r\n        const type = contentType.split(';')[0].split('/')[1];\r\n        try {\r\n            // switch case over the type and parse the content depending on the type\r\n            switch (type) {\r\n                case 'json':\r\n                    if (typeof body === 'string') {\r\n                        JSON.parse(body);\r\n                    }\r\n                    break;\r\n                case 'html':\r\n                case 'xml':\r\n                    const parser = new DOMParser();\r\n                    // @ts-ignore\r\n                    parser.parseFromString(body, content_type);\r\n                    break;\r\n                case 'csv':\r\n                    if (body.split('\\n').length < 1) {\r\n                        throw(null);\r\n                    }\r\n                    break;\r\n                default:\r\n                    break;\r\n            }\r\n        } catch (error) {\r\n            msg = `Expecting ${type.toUpperCase()} in body but response content does not look like it.`;\r\n        }\r\n\r\n        // if msg is not empty throw an exception about the error\r\n        if (msg !== '') {\r\n            const error: NetworkError = {\r\n                msg,\r\n                messageCode: 'Bad_Content',\r\n                type: 'content',\r\n                info: {\r\n                    response: response,\r\n                    request: request\r\n                },\r\n                icon: 'parse',\r\n                reload: false,\r\n                email: true\r\n            };\r\n            this.handleCheckError(error);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Match pattern using regex with response body\r\n     *\r\n     * @param response          An HTTPResponseBase object containing data about the XHR\r\n     * @return void\r\n     */\r\n    public MatchContent(request: HttpRequest<any>, response: HttpResponse<any>, pattern: RegExp | string): void {\r\n\r\n        // get the content from the response\r\n        let body = response.body;\r\n\r\n        // check if body type is Object\r\n        if (typeof body === 'object') {\r\n            body = JSON.stringify(body);\r\n        }\r\n\r\n        if(typeof pattern === \"string\")\r\n            pattern = new RegExp(pattern, \"gi\")\r\n\r\n        // check the regex\r\n        const results = body.match(pattern);\r\n\r\n        // if msg is not empty throw an exception about the error\r\n        if (results == null || results.length < 1) {\r\n            const error: NetworkError = {\r\n                msg: `Unable to find ${pattern} in response body.`,\r\n                messageCode: 'Bad_Content',\r\n                type: 'content',\r\n                info: {\r\n                    response: response,\r\n                    request: request\r\n                },\r\n                icon: 'parse',\r\n                reload: false,\r\n                email: true\r\n            };\r\n            this.handleCheckError(error);\r\n        }\r\n    }\r\n\r\n}","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { retry } from 'rxjs/operators';\r\nimport { Lang_Deutsch } from '../languages/de.lang';\r\nimport { Lang_English } from '../languages/en.lang';\r\nimport { Lang_Spanish } from '../languages/es.lang';\r\nimport { AllLanguages, Languages, NetworkError } from '../interfaces';\r\nimport { InterceptorParams } from '../utils';\r\nimport { NetworkCheckService } from './network-checks';\r\n\r\n@Injectable()\r\nexport class NetworkErrorService {\r\n\r\n    constructor(\r\n        private _http: HttpClient,\r\n        private _networkChecks: NetworkCheckService\r\n    ) {\r\n      // Convert Subject of ErrorStream to Observable\r\n      this.errorStream$ = this._networkChecks.errorStream.asObservable();\r\n    }\r\n\r\n    /** Variable holding the last eventId sended to Sentry */\r\n    sentryEventId: string;\r\n\r\n    /** Dictionary with all language sentences */\r\n    languagesDict: AllLanguages = {\r\n      'en': Lang_English,\r\n      'de': Lang_Deutsch,\r\n      'es': Lang_Spanish\r\n    }\r\n\r\n    /** Holds the hash for the current build */\r\n    private hash: string;\r\n\r\n    /**\r\n     * Gets the property hash and if not exists, it is created\r\n     */\r\n    public getHash(version: string) {\r\n      if (!this.hash) {\r\n        // Generate base64 hash from version\r\n        this.hash = btoa(version);\r\n      }\r\n      return this.hash;\r\n    }\r\n\r\n    /** Current language */\r\n    language: Languages;\r\n\r\n    /** Public language setter for developer */\r\n    public setLanguage(lang: Languages) {\r\n      this.language = lang;\r\n    }\r\n\r\n    /** Make error stream public as ordinary observable */\r\n    public errorStream$: Observable<NetworkError>;\r\n  \r\n    /** Provides a Request to trigger XSRF Token */\r\n    public triggerXsrfTokenCreation(apiUrl: string) {\r\n      return this._http.get(apiUrl, {\r\n        responseType: 'text',\r\n        params: new InterceptorParams({\r\n          ignoreDiskCache: true,\r\n          ignoreServiceWorkerCache: true,\r\n          ignoreProxyCache: true,\r\n          skipInterceptor: true\r\n        })\r\n      })\r\n    }\r\n\r\n    /** Provides a Request to Login into Cognos, with a retrying pipe */\r\n    public doCognosLogin(apiUrl: string, namespace: string, user: string, password: string) {\r\n        return this._http.post(`${apiUrl}login`, {\r\n          parameters: [\r\n            { name: 'CAMNamespace', value: namespace },\r\n            { name: 'h_CAM_action', value: 'logonAs' },\r\n            { name: 'CAMUsername', value: user },\r\n            { name: 'CAMPassword', value: password }\r\n          ]\r\n        }, {\r\n          observe: 'response',\r\n          params: new InterceptorParams({\r\n            skipInterceptor: true,\r\n          }),\r\n          headers: {\r\n            'X-Requested-With': 'XMLHttpRequest'\r\n          }\r\n        }).pipe(\r\n          retry(1)\r\n        );\r\n    }\r\n\r\n}","import { HttpErrorResponse } from '@angular/common/http';\r\nimport { Component, ChangeDetectionStrategy, Inject } from '@angular/core';\r\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { switchMap } from 'rxjs/operators';\r\nimport { NgxNetworkErrorConfiguration } from '../interfaces';\r\nimport { NetworkErrorService } from '../services/utility.service';\r\nimport { GlobalConfig } from '../tokens';\r\n\r\n@Component({\r\n  selector: 'dip-login',\r\n  templateUrl: './login.dialog.html',\r\n  changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class LoginDialog {\r\n\r\n  /** Login form schema */\r\n  loginForm: UntypedFormGroup;\r\n\r\n  constructor(\r\n    public dialogRef: MatDialogRef<LoginDialog>,\r\n    private _fb: UntypedFormBuilder,\r\n    private _utilityService: NetworkErrorService,\r\n    private _snack: MatSnackBar,\r\n    @Inject(GlobalConfig) readonly globalConfig: NgxNetworkErrorConfiguration\r\n  ) {\r\n    // Create form schema using FormBuilder for use in template\r\n    this.loginForm = this._fb.group({\r\n      user: ['', Validators.required],\r\n      password: ['', Validators.required]\r\n    });\r\n  }\r\n\r\n  login(values) {\r\n    // Try to grab login parameters from global config or customData object\r\n    // Grab apiUrl value\r\n    let apiUrl;\r\n    try {\r\n      apiUrl = this.globalConfig.customData.apiDomain + this.globalConfig.customData.apiLink;\r\n    } catch (err) {\r\n      apiUrl = '/internal/bi/v1/';\r\n      if (this.globalConfig.debug) console.log('apiDomain/apiLink not found in customData object, using default /internal/bi/v1/');\r\n    }\r\n    // Grab namespace value\r\n    let namespace;\r\n    try {\r\n      namespace = this.globalConfig.cognosNamespace || this.globalConfig.customData.cognosNamespace || '';\r\n    } catch (err) {\r\n      namespace = '';\r\n      if (this.globalConfig.debug) console.log('cognosNamespace not found in global config or customData object, using empty string');\r\n    }\r\n    // Try to get Cognos Portal URL from App Config\r\n    let portalUrl;\r\n    try {\r\n      portalUrl = this.globalConfig.customData.apiDomain + this.globalConfig.customData.portal;\r\n    } catch (err) {\r\n      portalUrl = '/internal/bi/';\r\n        if (this.globalConfig.debug) console.log('apiDomain/portal not found in customData object, using default /internal/bi/');\r\n    }\r\n    // Trigger XSRF Token creation of current domain and then do Login\r\n    this._utilityService.triggerXsrfTokenCreation(portalUrl).pipe(\r\n      // Switch to Login Dialog\r\n      switchMap(() => this._utilityService.doCognosLogin(apiUrl, namespace, values.user, values.password))\r\n    )\r\n    .subscribe(_ => {\r\n      // Close dialog after successful Login\r\n      this.dialogRef.close();\r\n    }, (err: HttpErrorResponse) => {\r\n      // Something went wrong :(\r\n      let messageError;\r\n      try {\r\n        let json = err.error;\r\n        if (typeof json !== 'object') {\r\n          json = JSON.parse(json);\r\n        }\r\n        messageError = json.messages[0].messageString;\r\n      } catch (err) {\r\n        messageError = 'Something went wrong while logging in';\r\n      }\r\n      this._snack.open(messageError, 'OK', { horizontalPosition: 'center', verticalPosition: 'bottom', duration: 5000 });\r\n      console.log('Something went wrong while logging in ... see details below:');\r\n      if (this.globalConfig.debug) console.log(err);\r\n    });\r\n  }\r\n\r\n}\r\n","<h2 mat-dialog-title>{{ 'LoginDialog_login_title' | translate }}</h2>\r\n<form [formGroup]=\"loginForm\" (ngSubmit)=\"login(loginForm.value)\">\r\n  <mat-dialog-content>\r\n    <mat-form-field color=\"primary\" appearance=\"fill\">\r\n      <mat-label>{{ 'LoginDialog_user' | translate }}</mat-label>\r\n      <input matInput formControlName=\"user\">\r\n    </mat-form-field>\r\n    <mat-form-field color=\"primary\" appearance=\"fill\">\r\n      <mat-label>{{ 'LoginDialog_password' | translate }}</mat-label>\r\n      <input matInput formControlName=\"password\" type=\"password\">\r\n    </mat-form-field>\r\n  </mat-dialog-content>\r\n  <mat-dialog-actions align=\"end\">\r\n    <button mat-flat-button color=\"primary\" [disabled]=\"loginForm.invalid\" type=\"submit\">{{ 'LoginDialog_login_btn' | translate }}</button>\r\n  </mat-dialog-actions>\r\n</form>","import { Observable, of, throwError } from \"rxjs\";\r\nimport { delay, mergeMap, retryWhen } from \"rxjs/operators\";\r\n\r\nconst getErrorMessage = (maxRetry: number) => `Tried to load Resource over XHR for ${maxRetry} times without success. Giving up.`;\r\n\r\nconst DEFAULT_MAX_RETRIES = 5;\r\nconst DEFAULT_INCREMENTAL = 1000;\r\n\r\n/**\r\n * Custom RxJS Operator to retry an observable x times with a delay\r\n * @param delayMs Time between retries (milliseconds)\r\n * @param maxRetry How many times to retry\r\n * @see https://medium.com/angular-in-depth/retry-failed-http-requests-in-angular-f5959d486294\r\n */\r\nexport function delayedRetry(delayMs: number, maxRetry = DEFAULT_MAX_RETRIES) {\r\n    let retries = maxRetry;\r\n    return (src: Observable<any>) => src.pipe(\r\n        retryWhen((errors: Observable<any>) => errors.pipe(\r\n            delay(delayMs),\r\n            mergeMap(error => retries-- > 0 ? of(error) : throwError(getErrorMessage(maxRetry)))\r\n        ))\r\n    )\r\n}\r\n\r\n/**\r\n * Custom RxJS Operator to retry an observable x times with an incremental delay\r\n * @param delayMs Base time between retries (milliseconds)\r\n * @param maxRetry How many times to retry\r\n * @param incrementMs Time to increment after first retry (milliseconds)\r\n * @see https://medium.com/angular-in-depth/retry-failed-http-requests-in-angular-f5959d486294\r\n */\r\nexport function incrementalRetry(delayMs: number, maxRetry = DEFAULT_MAX_RETRIES, incrementMs = DEFAULT_INCREMENTAL) {\r\n    let retries = maxRetry;\r\n    return (src: Observable<any>) => src.pipe(\r\n        retryWhen((errors: Observable<any>) => errors.pipe(\r\n            mergeMap(error => {\r\n                if (retries-- > 0) {\r\n                    const incrementalTime = delayMs + (maxRetry - retries) * incrementMs;\r\n                    return of(error).pipe(\r\n                        delay(incrementalTime)\r\n                    )\r\n                }\r\n                return throwError(getErrorMessage(maxRetry));\r\n            })\r\n        ))\r\n    )\r\n}","import { Inject, Injectable, NgZone } from '@angular/core';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse, HttpResponse } from '@angular/common/http';\r\nimport { NEVER, Observable, throwError } from 'rxjs';\r\nimport { catchError, filter, switchMap, map, tap } from 'rxjs/operators';\r\nimport { NgxNetworkErrorConfiguration, NetworkError, NetworkRetry, DialogIds, IHttpParams, IHttpHeaders, IResponseType } from '../interfaces';\r\nimport { LoginDialog } from '../login/login.dialog';\r\nimport { GlobalConfig } from '../tokens';\r\nimport { NetworkCheckService } from './network-checks';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { delayedRetry, incrementalRetry } from '../custom-operators';\r\nimport { InterceptorParams } from '../utils';\r\nimport { captureException } from '@sentry/browser';\r\nimport { NetworkErrorService } from './utility.service';\r\n\r\n/**\r\n * HTTP Error Interceptor\r\n * @description This service is responsible for handling any network error and content checks\r\n * It also provides customization depending on the global and request options used\r\n * This interceptor does not check the errors specificly, this is done in NetworkCheckService through here \r\n * @documentation https://angular.io/api/common/http/HttpInterceptor\r\n */\r\n@Injectable()\r\nexport class ErrorInterceptor implements HttpInterceptor {\r\n\r\n    /**\r\n     * Grab Global configuration, NetworkCheckService and MatDialog injected from AppModule\r\n     * Every parameter used here must be passed from main module in HTTP_INTERCEPTORS definition\r\n     * */\r\n    constructor(\r\n        @Inject(GlobalConfig) private readonly globalConfig: NgxNetworkErrorConfiguration,\r\n        private checker: NetworkCheckService,\r\n        private utilityService: NetworkErrorService,\r\n        private dialog: MatDialog,\r\n        private ngZone: NgZone\r\n    ) { }\r\n\r\n    /**\r\n     * This function is responsible for intercepting all requests done through HttpClient\r\n     * Requests done without HttpClient Service will not be handled (fetch, ajax, etc)\r\n     * @param req Request options\r\n     * @param next Handler for modified request\r\n     */\r\n    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n        // Debug global configuration object\r\n        if (this.globalConfig.debug) console.log('GlobalConfig:', this.globalConfig);\r\n        // Set RequestConfig data in NetworkCheckService for later usage if an error occurs\r\n        if (req.params instanceof InterceptorParams) {\r\n            this.checker.requestConfig = req.params.requestParams;\r\n        }\r\n        // Save original responseType for future conversion\r\n        const originalResponseType = req.responseType;\r\n        // Set responseType as text\r\n        // We will later convert the body to this original format\r\n        let request = this.setRequestResponseType(req, 'text');\r\n        // Set X-Requested-With header for all requests\r\n        request = this.addHeadersToRequest(request, { 'X-Requested-With': 'XMLHttpRequest' });\r\n        // Check if XSRF Token exists in cookies or localStorage and set it\r\n        const xsrf = this.getCookie('XSRF-TOKEN') || localStorage.getItem('xsrf');\r\n        if (xsrf) {\r\n            request = this.addHeadersToRequest(request, { 'X-XSRF-TOKEN': xsrf });\r\n        }\r\n        // Handle some custom request params\r\n        // InterceptorParams is a constructor coming from params in the request options\r\n        if (request.params instanceof InterceptorParams) {\r\n            // Grab Interceptor Params at request level\r\n            const interceptorParams = request.params.requestParams;\r\n            // Handle ignoreDiskCache\r\n            if (interceptorParams.ignoreDiskCache) {\r\n                request = this.addParamsToRequest(request, { 'cache-bust': (new Date()).getTime().toString() }) // Cache busting parameter\r\n            }\r\n            // Handle ignoreServiceWorkerCache\r\n            if (interceptorParams.ignoreServiceWorkerCache) {\r\n                request = this.addHeadersToRequest(request, { 'ngsw-bypass': '1' });\r\n            }\r\n            // Handle ignoreProxyCache\r\n            if (interceptorParams.ignoreProxyCache) {\r\n                request = this.addHeadersToRequest(request, { 'Cache-Control': 'no-store' });\r\n            }\r\n        }\r\n        if (this.globalConfig.version) {\r\n            request = this.addVersioningHash(request, this.globalConfig.version);\r\n        }\r\n        // Handle skip interceptor of errors\r\n        // If skipInterceptor is set to true, this interceptor will not be used\r\n        // Also ignore interceptor if request is retried, we will use a custom header named \"Retrying-Request\"\r\n        if ((req.params instanceof InterceptorParams && req.params.requestParams.skipInterceptor) || req.headers.has('Retrying-Request')) {\r\n            // Return handler of request without further processing\r\n            return next.handle(request);\r\n        }\r\n        // Return handler of modified request to Interceptor\r\n        return next.handle(request).pipe(\r\n            // Filter by finished request, we are not interested in any other type\r\n            filter(e => e.type !== 0),\r\n            // Catch error status codes\r\n            catchError((err: HttpErrorResponse) => {\r\n                try {\r\n                    // Check error code of response\r\n                    this.checker.CheckStatusCode(request, err);\r\n                } catch (err) {\r\n                    // Debug error\r\n                    if (this.globalConfig.debug) console.log('Error:', err);\r\n                    // Make sure err is of type NetworkError\r\n                    if (err && err.type) {\r\n                        // Cast NetworkError for inner usage\r\n                        const error = err as NetworkError;\r\n                        // Remove Service Workers always when 401 or 441\r\n                        if ('serviceWorker' in navigator) {\r\n                            navigator.serviceWorker.getRegistrations().then(registrations => {\r\n                                for ( let registration of registrations ) {\r\n                                    registration.unregister();\r\n                                }\r\n                            })\r\n                        }\r\n                        // If error corresponds to session issues and current authType is Cognos, do Login and retry request\r\n                        if (error.type === 'status' && error.reload && this.globalConfig.authType === 'cognos') {\r\n                            // Handle 403\r\n                            if (error.info.response.status === 403) {\r\n                                // First trigger XSRF Token generation\r\n                                return this.utilityService.triggerXsrfTokenCreation('/internal/bi/').pipe(\r\n                                    // Show Session expired\r\n                                    tap(_ => this.checker.handleCheckError(error, true))\r\n                                )\r\n                            }\r\n                            // Get instance of Login Dialog\r\n                            const loginDialogExists = this.dialog.getDialogById(DialogIds.Login);\r\n                            // Check if instance is undefined, therefore openning Login Dialog\r\n                            // This check avoids openning the Login Dialog in some cases where requests are retried,\r\n                            // or when multiple requests are done\r\n                            if (!loginDialogExists) {\r\n                                // Return LoginDialog Observable\r\n                                // When LoginDialog is completed and closed, this emits using afterClosed() callback\r\n                                return this.ngZone.run<MatDialogRef<LoginDialog, any>>(() => {\r\n                                    return this.dialog.open(LoginDialog, {\r\n                                        id: DialogIds.Login,\r\n                                        panelClass: 'login-panel',\r\n                                        backdropClass: ['login-backdrop', 'cdk-overlay-dark-backdrop'],\r\n                                        hasBackdrop: true,\r\n                                        disableClose: true\r\n                                    })\r\n                                }).afterClosed().pipe(\r\n                                    // Retry unauthorized request\r\n                                    // Returning the original request makes the user see the request has been continued\r\n                                    // without any interrumption\r\n                                    switchMap(() => next.handle(request.clone()))\r\n                                )\r\n                            } else {\r\n                                // If Login Dialog instance exists, return Empty Observable\r\n                                // NEVER is an Observable which doesn't emit any value nor completes,\r\n                                // therefore following Interceptor chain is not executed\r\n                                return NEVER;\r\n                            }\r\n                        } else {\r\n                            // Handle the error, which is not of type Unauthorized\r\n                            this.checker.handleCheckError(error);\r\n                        }\r\n                    }\r\n                    // Rethrow error for retry catchError\r\n                    return throwError(err);\r\n                }\r\n            }),\r\n            // CatchError for handling retry parameters\r\n            catchError(err => {\r\n                // Grab important parameter from InterceptorParams instance\r\n                const important = request.params instanceof InterceptorParams && request.params.requestParams.important;\r\n                // Grab retry parameter from InterceptorParams instance or global configuration, default is object with 0 retries\r\n                const retry: NetworkRetry = (request.params instanceof InterceptorParams && request.params.requestParams.retry) || this.globalConfig.retry || { count: 0, delay: 0 };\r\n                // Only process if retry.count is greater than 0, otherwise makes no sense\r\n                if (retry.count > 0) {\r\n                    // Set Retrying-Request header to request, we don't want to show an error dialog for each time the request is retried\r\n                    request = this.addHeadersToRequest(request, { 'Retrying-Request': '1' })\r\n                    if (retry.increment > 0) {\r\n                        // Use Incremental Retry\r\n                        return next.handle(request).pipe(\r\n                            incrementalRetry(retry.delay, retry.count, retry.increment)\r\n                        )\r\n                    } else {\r\n                        // Use Delayed Retry\r\n                        return next.handle(request).pipe(\r\n                            delayedRetry(retry.delay, retry.count)\r\n                        )\r\n                    }\r\n                }\r\n                // Send error to Sentry if available\r\n                this.sendSentry(err);\r\n                // Nothing else to do, return never Observable\r\n\r\n                // Disaster!!! Testing purposes only!!!\r\n                // NEVER observable does not emit any values or errors, not completes.\r\n                // meaning that subscription observer cannot treat error\r\n                // adittionally, when subscribing to NEVER variable, the data stream does not close itself even if it is related to http request\r\n                // which causes the famous memory leaks of angular. Stream has to be closed manually by calling >>>> unsubscribe() <<<<<\r\n                // return NEVER;\r\n\r\n                // allow component to set custome description for error via localstorage\r\n                err.description = JSON.parse(localStorage.getItem(\"custom_http_error_message\"))\r\n                return next.handle(err);\r\n            }),\r\n            // Handle successful requests with wrong contents and convert body to original responseType if necessary\r\n            map((res: HttpEvent<any>) => {\r\n                // Usually the response will be of type HttpResponse\r\n                if (res instanceof HttpResponse) {\r\n                    // If request params contains Interceptor specific params, use it's contentChecks as testcase\r\n                    if (request.params instanceof InterceptorParams) {\r\n                        try {\r\n                            // Perform Sanity Checks\r\n                            this.checker.handleResponseChecks(request.params.requestParams, request, res)\r\n                        } catch (err) {\r\n                            // Return original response, error handling is done in NetworkCheckService\r\n                            // Send error to Sentry\r\n                            this.sendSentry(err);\r\n                            return res;\r\n                        }\r\n                    }\r\n                    if (originalResponseType === 'json') {\r\n                        // response.body from original request is expected to contain JSON\r\n                        // therefore we have to manually parse it\r\n                        try {\r\n                            return res.clone({\r\n                                body: JSON.parse(res.body)\r\n                            });\r\n                        } catch (err) {\r\n                            // Send error to Sentry\r\n                            this.sendSentry(err);\r\n                            console.log('Unable to parse response text as JSON')\r\n                        }\r\n                    }\r\n                    // Return modified response\r\n                    return res;\r\n                } else {\r\n                    // Return unmodified response\r\n                    return res;\r\n                }\r\n            })\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Sends the passed error to a Sentry Server\r\n     * Only if specified in Global Configuration > reporting > sentryDSN\r\n     * @param error NetworkError, error object comming from any error handler of NetworkCheckService\r\n     */\r\n    sendSentry(error: NetworkError) {\r\n        if (this.globalConfig.reporting && this.globalConfig.reporting.sentryDSN) {\r\n            // Send error using Sentry catcher\r\n            const eventId = captureException(error);\r\n            this.utilityService.sentryEventId = eventId;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Adds param/s using an object of type HttpParams\r\n     * @param request Request to modify\r\n     * @param params Params to add\r\n     * @returns HttpRequest\r\n     */\r\n    addParamsToRequest<T>(request: HttpRequest<T>, params: IHttpParams): HttpRequest<T> {\r\n        return request.clone({\r\n            setParams: params\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Adds cache busting parameter based on current build hash\r\n     * @param request Request to modify\r\n     * @returns HttpRequest\r\n     */\r\n    addVersioningHash<T>(request: HttpRequest<T>, version: string): HttpRequest<T> {\r\n        return request.clone({\r\n            setParams: {\r\n                v: this.utilityService.getHash(version)\r\n            }\r\n        })\r\n    }\r\n\r\n    /**\r\n     * Removes a param from a request with a given name\r\n     * @param request Request to modify\r\n     * @param param Param to remove\r\n     * @returns HttpRequest\r\n     */\r\n    removeParamOfRequest<T>(request: HttpRequest<T>, param: string): HttpRequest<T> {\r\n        return request.clone({\r\n            params: request.params.delete(param)\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Adds header/s using an object of type HttpHeaders\r\n     * @param request Request to modify\r\n     * @param header Headers to add\r\n     * @returns HttpRequest\r\n     */\r\n    addHeadersToRequest<T>(request: HttpRequest<T>, headers: IHttpHeaders): HttpRequest<T> {\r\n        return request.clone({\r\n            setHeaders: headers\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Removes a header from a request with a given name\r\n     * @param request Request to modify\r\n     * @param header Header to remove\r\n     * @returns HttpRequest\r\n     */\r\n    removeHeaderOfRequest<T>(request: HttpRequest<T>, header: string): HttpRequest<T> {\r\n        return request.clone({\r\n            headers: request.headers.delete(header)\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Sets the responseType for the given request\r\n     * @param request Request to modify\r\n     * @param responseType ResponseType to set response format\r\n     * @returns HttpRequest\r\n     */\r\n    setRequestResponseType<T>(request: HttpRequest<T>, responseType: IResponseType): HttpRequest<T> {\r\n        return request.clone({ responseType: responseType });\r\n    }\r\n\r\n    /**\r\n     * Get cookie content by a cookie name\r\n     * @param name Name of cookie\r\n     * @returns string | undefined\r\n     */\r\n    getCookie(name) {\r\n        const value = '; ' + document.cookie;\r\n        const parts = value.split('; ' + name + '=');\r\n        if (parts.length == 2) return parts.pop().split(';').shift()\r\n    }\r\n\r\n}","import { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { ModuleWithProviders, NgModule, NgZone } from '@angular/core';\r\nimport { ErrorDialog } from './dialog/error.dialog';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NetworkCheckService } from './services/network-checks';\r\nimport { ErrorInterceptor } from './services/http-interceptor';\r\nimport { NetworkError, NgxNetworkErrorConfiguration } from './interfaces';\r\nimport { mergeDeep } from './utils';\r\nimport { LoginDialog } from './login/login.dialog';\r\nimport { NetworkErrorService } from './services/utility.service';\r\nimport { LanguageService } from './services/language.service';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { GlobalConfig } from './tokens';\r\nimport { TranslatePipe } from './pipes/translate.pipe';\r\nimport { EventHint, init } from '@sentry/browser';\r\n\r\n/** Default module parameters */\r\nconst defaultConfig: NgxNetworkErrorConfiguration = {\r\n  debug: false,\r\n  authType: 'openid',\r\n  contacts: [],\r\n  reporting: {},\r\n  retry: {\r\n    count: 0,\r\n    delay: 0\r\n  },\r\n  language: 'en',\r\n  silent: false\r\n}\r\n\r\n\r\n@NgModule({\r\n  declarations: [\r\n    ErrorDialog,\r\n    LoginDialog,\r\n    TranslatePipe\r\n  ],\r\n  imports: [\r\n    CommonModule,\r\n    MatDialogModule,\r\n    MatButtonModule,\r\n    MatFormFieldModule,\r\n    MatInputModule,\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    MatSnackBarModule\r\n  ],\r\n  providers: [\r\n    NetworkCheckService,\r\n    LanguageService,\r\n    ErrorInterceptor,\r\n    NetworkErrorService,\r\n    MatDialog,\r\n    // Provide ErrorInterceptor in the root NgModule of the application using this plugin\r\n    {\r\n      provide: HTTP_INTERCEPTORS,\r\n      useClass: ErrorInterceptor,\r\n      deps: [\r\n        GlobalConfig,\r\n        NetworkCheckService,\r\n        NetworkErrorService,\r\n        MatDialog,\r\n        NgZone\r\n      ],\r\n      multi: true\r\n    }\r\n  ],\r\n  exports: [\r\n    // Add one default\r\n    ErrorDialog,\r\n    LoginDialog\r\n  ]\r\n})\r\nexport class NgxNetworkErrorModule {\r\n\r\n  // Provide forRoot method for the user to be able to pass parameters\r\n  static forRoot(conf: NgxNetworkErrorConfiguration = {}): ModuleWithProviders<NgxNetworkErrorModule> {\r\n    // Merge default parameters with passed parameters\r\n    const options = mergeDeep(defaultConfig, conf) as NgxNetworkErrorConfiguration;\r\n    let sentryDSN = '';\r\n    try {\r\n      sentryDSN = options && options.reporting && options.reporting.sentryDSN\r\n    } catch (err) { }\r\n    // Initialize Sentry Reporting\r\n    init({\r\n      dsn: sentryDSN, // Provide Sentry URL\r\n      debug: options.debug, // Debug if global options debug is enabled\r\n      enabled: !!sentryDSN, // Enabled only if URL of Sentry is provided\r\n      ignoreErrors: options.reporting.ignoreErrors || [],\r\n      denyUrls: [\r\n        // Block chrome extensions errors\r\n        /extensions\\//i,\r\n        /^chrome:\\/\\//i,\r\n        // Block DEV environments\r\n        'localhost',\r\n        'co.meta.de'\r\n      ],\r\n      // Execute custom function before sending error event\r\n      beforeSend: (event, hint?: EventHint) => {\r\n        try {\r\n          // Get original error object\r\n          const originalError = (hint.originalException as any) as NetworkError;\r\n          // change event finger print\r\n          event.fingerprint = [\r\n            originalError.messageCode,\r\n            originalError.msg\r\n          ]\r\n          // Set tag of email\r\n          if (originalError.email) {\r\n            if (!event.tags) event.tags = {};\r\n            event.tags.email = true;\r\n          }\r\n          // Set title as tag\r\n          if (originalError.msg) {\r\n            if (!event.tags) event.tags = {};\r\n            event.tags.title = originalError.msg;\r\n          }\r\n          event.extra.__serialized__ = originalError;\r\n          event.message = originalError.msg;\r\n          // Set error title, if we don't define it it will be shown in Sentry as \"Non-Error exception captured with keys: ...\"\r\n          event.exception.values[0].value = originalError.msg;\r\n        } catch (err) { }\r\n        return event;\r\n      }\r\n    })\r\n    return {\r\n      // Provide own plugin module\r\n      ngModule: NgxNetworkErrorModule,\r\n      providers: [\r\n        // Provide configuration object from the user to the plugin\r\n        {\r\n          provide: GlobalConfig,\r\n          useValue: options\r\n        }\r\n      ]\r\n    };\r\n  }\r\n}\r\n","/*\r\n * Public API Surface of ngx-network-error\r\n */\r\n// export * from './lib/ngx-network-error.module';\r\nexport * from './lib/interfaces';\r\nexport * from './lib/services/http-interceptor';\r\nexport * from './lib/services/network-checks';\r\nexport * from './lib/services/utility.service';\r\nexport * from './lib/dialog/error.dialog';\r\nexport * from './lib/ngx-network-error.module';\r\nexport * from './lib/login/login.dialog';\r\nexport * from './lib/utils';\r\nexport * from './lib/tokens';\r\nexport * from './lib/custom-operators';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.LanguageService","i3.NetworkErrorService","i6.TranslatePipe","i1","i2.NetworkCheckService","i2","i8.TranslatePipe","i1.NetworkCheckService","i2.NetworkErrorService","i3"],"mappings":"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"}