ngx-oauth 4.2.2 → 4.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-oauth.mjs","sources":["../../../projects/ngx-oauth/src/lib/models/index.ts","../../../projects/ngx-oauth/src/lib/services/token.service.ts","../../../projects/ngx-oauth/src/lib/services/oauth.service.ts","../../../projects/ngx-oauth/src/lib/services/oauth.interceptor.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.html","../../../projects/ngx-oauth/src/lib/oauth.module.ts","../../../projects/ngx-oauth/src/index.ts","../../../projects/ngx-oauth/src/ngx-oauth.ts"],"sourcesContent":["import {FactoryProvider, inject, Injectable, InjectionToken, ValueProvider} from '@angular/core';\nimport {HttpClient, HttpHeaders} from '@angular/common/http';\n\nexport const SERVER_HOST = new InjectionToken<string>('SERVER_HOST');\nexport const SERVER_PATH = new InjectionToken<string>('SERVER_PATH');\nexport const LOCATION = new InjectionToken<Location>('Location');\nexport const STORAGE = new InjectionToken<Storage>('Storage');\nexport const OAUTH_CONFIG = new InjectionToken<OAuthConfig[]>('OAuthConfig');\nexport const OAUTH_TOKEN = new InjectionToken<OAuthToken>('OAuthToken');\nexport const HEADER_APPLICATION = new HttpHeaders({'Content-Type': 'application/x-www-form-urlencoded'});\nexport const OAUTH_HTTP_CLIENT = new InjectionToken<HttpClient>('OAuthHttpClient');\n\n@Injectable({\n providedIn: 'root',\n useFactory: () => inject(OAUTH_CONFIG).reduce((p, c) => ({...p, ...c}), {})\n})\nexport abstract class OAuthConfig {\n config?: OAuthTypeConfig;\n storageKey?: string;\n storage?: Storage;\n ignorePaths?: RegExp[];\n}\n\nexport const provideOAuthConfig = (config: OAuthConfig = {}): ValueProvider => ({\n provide: OAUTH_CONFIG,\n useValue: config,\n multi: true\n});\n\nexport const provideOAuthConfigFactory = (factory: Function, deps?: any[]): FactoryProvider => ({\n provide: OAUTH_CONFIG,\n useFactory: factory,\n deps: deps,\n multi: true\n});\n\nexport enum OAuthType {\n RESOURCE = 'password',\n AUTHORIZATION_CODE = 'code',\n IMPLICIT = 'token',\n CLIENT_CREDENTIAL = 'client_credentials'\n}\n\nexport interface ClientCredentialConfig {\n tokenPath: string;\n revokePath?: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\n// tslint:disable-next-line:no-empty-interface\nexport interface ResourceConfig extends ClientCredentialConfig {\n}\n\nexport interface ImplicitConfig {\n authorizePath: string;\n revokePath?: string;\n clientId: string;\n scope?: string;\n logoutPath?: string;\n logoutRedirectUri?: string;\n}\n\nexport interface AuthorizationCodeConfig extends ResourceConfig {\n authorizePath: string;\n}\n\nexport interface AuthorizationCodePKCEConfig extends AuthorizationCodeConfig {\n pkce: boolean;\n}\n\nexport interface OpenIdConfig {\n issuerPath: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\nexport interface ResourceParameters {\n username: string;\n password: string;\n}\n\nexport interface AuthorizationParameters {\n redirectUri: string;\n responseType: OAuthType.IMPLICIT | OAuthType.AUTHORIZATION_CODE | string;\n state?: string;\n}\n\nexport type OAuthParameters = ResourceParameters | AuthorizationParameters;\nexport type OAuthTypeConfig = OpenIdConfig\n | AuthorizationCodePKCEConfig\n | AuthorizationCodeConfig\n | ImplicitConfig\n | ResourceConfig\n | ClientCredentialConfig;\n\nexport interface OAuthToken {\n id_token?: string;\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n state?: string;\n error?: string;\n error_description?: string;\n expires_in?: number | string;\n refresh_expires_in?: number | string;\n scope?: string;\n codeVerifier?: string;\n nonce?: string;\n type?: OAuthType;\n expires?: number;\n \n [x: string]: any;\n}\n\nexport enum OAuthStatus {\n NOT_AUTHORIZED = 'NOT_AUTHORIZED',\n AUTHORIZED = 'AUTHORIZED',\n DENIED = 'DENIED'\n}\n\nexport interface OpenIdConfiguration {\n issuer?: string;\n authorization_endpoint?: string;\n introspection_endpoint?: string;\n token_endpoint?: string;\n userinfo_endpoint?: string;\n end_session_endpoint?: string;\n revocation_endpoint?: string;\n scopes_supported?: string[];\n code_challenge_methods_supported?: string[];\n}\n\nexport interface UserInfo {\n email?: string;\n email_verified?: boolean;\n family_name?: string;\n given_name?: string;\n name?: string;\n preferred_username?: string;\n sub?: string;\n address?: object;\n picture?: string;\n locale?: string;\n}\n\nexport interface IntrospectInfo extends UserInfo {\n active: boolean;\n scope: string;\n client_id?: string;\n username: string;\n exp: number;\n}\n","import {Inject, Injectable, NgZone} from '@angular/core';\nimport {BehaviorSubject, distinctUntilChanged, Observable, of, switchMap} from 'rxjs';\nimport {HEADER_APPLICATION, OAUTH_HTTP_CLIENT, OAuthConfig, OAuthToken} from '../models';\nimport {catchError, map, shareReplay} from 'rxjs/operators';\nimport {HttpClient, HttpParams} from '@angular/common/http';\n\nconst isExpiredToken = (token?: OAuthToken) => token && token.expires && Date.now() > token.expires || false;\n\n@Injectable()\nexport class TokenService {\n\n #token$ = new BehaviorSubject<OAuthToken>(this.saved);\n token$ = this.#token$.pipe(\n distinctUntilChanged((p, c) => JSON.stringify(p || null) === JSON.stringify(c || null)),\n shareReplay(1),\n switchMap(token => !isExpiredToken(token) && of(token) || this.refreshToken(token)),\n );\n type$ = this.token$.pipe(\n map(token => token?.type),\n shareReplay(1)\n );\n accessToken$ = this.token$.pipe(\n map(token => token?.access_token),\n shareReplay(1),\n );\n\n constructor(protected authConfig: OAuthConfig,\n @Inject(OAUTH_HTTP_CLIENT) protected http: HttpClient,\n protected zone: NgZone) {\n }\n\n get token() {\n return this.#token$.value;\n }\n\n set token(token) {\n const expiresIn = Number(token.expires_in) || 0;\n const result = {\n ...token,\n ...expiresIn && {expires: Date.now() + expiresIn * 1000} || {}\n };\n this.saved = result;\n this.#token$.next(result);\n }\n\n get saved() {\n const {storageKey, storage} = this.authConfig;\n return storageKey && storage && storage[storageKey] && JSON.parse(storage[storageKey]) || {};\n }\n\n set saved(token: OAuthToken) {\n const {storageKey, storage} = this.authConfig;\n if (storage && storageKey) {\n if (token) {\n storage[storageKey] = JSON.stringify(token);\n } else {\n delete storage[storageKey];\n }\n }\n }\n\n protected refreshToken(token?: OAuthToken): Observable<OAuthToken> {\n const {tokenPath, clientId, clientSecret, scope} = this.authConfig.config as any;\n const {refresh_token} = token || {};\n return tokenPath && refresh_token && this.http.post<OAuthToken>(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: 'refresh_token',\n refresh_token,\n ...scope && {scope} || {},\n }\n }), {\n headers: HEADER_APPLICATION\n }).pipe(\n catchError(() => {\n this.token = {};\n return of(this.token);\n }),\n map(token => {\n this.token = {\n ...this.token,\n ...token\n };\n return this.token;\n })\n ) || of(token);\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport {HttpClient, HttpParams} from '@angular/common/http';\nimport {catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap} from 'rxjs/operators';\nimport {firstValueFrom, from, noop, of, ReplaySubject, throwError} from 'rxjs';\nimport {\n AuthorizationCodeConfig,\n AuthorizationParameters,\n HEADER_APPLICATION,\n LOCATION,\n OAuthConfig,\n OAuthParameters,\n OAuthStatus,\n OAuthToken,\n OAuthType,\n OAuthTypeConfig,\n OpenIdConfig,\n OpenIdConfiguration,\n ResourceParameters,\n UserInfo\n} from '../models';\nimport {Location as Location2} from '@angular/common';\nimport {TokenService} from './token.service';\n\nconst arrToString = (buf: Uint8Array) => buf.reduce((s, b) => s + String.fromCharCode(b), '');\n\nconst base64url = (str: string) => btoa(str)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\nconst randomString = (length: number = 48) => {\n const buff = arrToString(crypto.getRandomValues(new Uint8Array(length * 2)));\n return base64url(buff).substring(0, length);\n};\n\nconst pkce = async (value: string) => {\n const buff = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));\n return base64url(arrToString(new Uint8Array(buff)));\n};\n\nconst parseOauthUri = (hash: string) => {\n const regex = /([^&=]+)=([^&]*)/g;\n const params: Record<string, string> = {};\n let m;\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = regex.exec(hash)) !== null) {\n params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);\n }\n return Object.keys(params).length && params || {};\n};\n\nconst jwt = (token: string) => JSON.parse(atob(token.split('.')[1]));\n\n@Injectable()\nexport class OAuthService {\n\n state$ = new ReplaySubject<string>(1);\n config$ = of(this.config).pipe(\n filter(Boolean),\n filter(config => !!config?.clientId),\n map(config => config as OpenIdConfig),\n switchMap(config => !config.issuerPath && of(config) || this.http.get<OpenIdConfiguration>(`${config.issuerPath}/.well-known/openid-configuration`).pipe(\n tap(v => this.config = {\n ...v.authorization_endpoint && {authorizePath: v.authorization_endpoint} || {},\n ...v.token_endpoint && {tokenPath: v.token_endpoint} || {},\n ...v.revocation_endpoint && {revokePath: v.revocation_endpoint} || {},\n ...v.code_challenge_methods_supported && {pkce: v.code_challenge_methods_supported.indexOf('S256') > -1} || {},\n ...v.userinfo_endpoint && {userPath: v.userinfo_endpoint} || {},\n ...v.introspection_endpoint && {introspectionPath: v.introspection_endpoint} || {},\n ...v.end_session_endpoint && {logoutPath: v.end_session_endpoint} || {},\n ...{scope: config.scope || 'openid'}\n } as any),\n map(() => this.config)\n )),\n shareReplay(1)\n );\n token$ = this.config$.pipe(\n tap(config => {\n const {hash, search, origin, pathname} = this.location;\n const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);\n const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search) || hash && /(code=)|(error=)/.test(hash);\n if (isImplicitRedirect) {\n const parameters = parseOauthUri(hash.substring(1));\n this.token = {\n ...parameters,\n type: OAuthType.IMPLICIT,\n };\n this.checkResponse(this.token, parameters);\n } else if (isAuthCodeRedirect) {\n const parameters = parseOauthUri(search && search.substring(1) || hash && hash.substring(1));\n if (!this.checkResponse(this.token, parameters)) {\n this.token = parameters;\n } else {\n const newParametersString = this.getCleanedUnSearchParameters();\n const {clientId, clientSecret, tokenPath, scope} = config as AuthorizationCodeConfig;\n const {codeVerifier} = this.token || {}; //should be set by authorizationUrl construction\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n code: parameters?.['code'],\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n redirect_uri: `${origin}${pathname}`,\n grant_type: 'authorization_code',\n ...scope && {scope} || {},\n ...codeVerifier && {code_verifier: codeVerifier} || {}\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n ).subscribe(token => {\n this.token = {\n ...token,\n type: OAuthType.AUTHORIZATION_CODE\n };\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n });\n }\n }\n }),\n switchMap(() => this.tokenService.token$),\n shareReplay(1)\n );\n status$ = this.token$.pipe(\n map(token => token.access_token && OAuthStatus.AUTHORIZED || token.error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED),\n shareReplay(1)\n );\n userInfo$ = this.status$.pipe(\n filter(s => s === OAuthStatus.AUTHORIZED),\n map(() => (this.config as any).userPath),\n filter(Boolean),\n switchMap(path => this.getUserInfo(path)),\n shareReplay(1)\n );\n type$ = this.tokenService.type$;\n ignorePaths = this.authConfig.ignorePaths || [];\n\n get token() {\n return this.tokenService.token;\n }\n\n set token(token) {\n this.tokenService.token = token;\n }\n\n get config() {\n return this.authConfig.config;\n }\n\n set config(config: OAuthTypeConfig | undefined) {\n if (config) {\n this.authConfig.config = {\n ...this.authConfig.config,\n ...config\n };\n }\n }\n\n constructor(protected authConfig: OAuthConfig,\n protected tokenService: TokenService,\n protected http: HttpClient,\n @Inject(LOCATION) protected location: Location,\n protected locationService: Location2) {\n }\n\n async login(parameters?: OAuthParameters) {\n if (!!parameters && (parameters as ResourceParameters).password) {\n await this.resourceLogin(parameters as ResourceParameters);\n } else if (!!parameters && (parameters as AuthorizationParameters).redirectUri && (parameters as AuthorizationParameters).responseType\n ) {\n await this.toAuthorizationUrl(parameters as AuthorizationParameters);\n } else {\n await this.clientCredentialLogin();\n }\n }\n\n logout(useLogoutUrl?: boolean) {\n this.revoke();\n this.token = {};\n const {logoutPath, logoutRedirectUri} = this.authConfig.config as any;\n if (useLogoutUrl && logoutPath) {\n const {origin, pathname} = this.location;\n const currentPath = `${origin}${pathname}`;\n this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);\n }\n }\n\n getUserInfo(path?: string) {\n const {userPath} = this.config as any;\n return this.http.get<UserInfo>(path || userPath);\n }\n\n protected revoke() {\n const {revokePath, clientId, clientSecret} = this.authConfig.config as any;\n if (revokePath) {\n const {access_token, refresh_token} = this.token || {};\n const toRevoke = [];\n if (access_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: access_token,\n token_type_hint: 'access_token'\n });\n }\n if (refresh_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: refresh_token,\n token_type_hint: 'refresh_token'\n });\n }\n from(toRevoke).pipe(\n concatMap(o => of(o).pipe(delay(300))), // space request to avoid cancellation\n switchMap(o => this.http.post(revokePath, new HttpParams({fromObject: o}))),\n ).subscribe(noop);\n }\n }\n\n protected clientCredentialLogin() {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n return firstValueFrom(this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n client_secret: clientSecret,\n grant_type: OAuthType.CLIENT_CREDENTIAL,\n ...scope ? {scope} : {},\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n catchError((err) => {\n this.token = err;\n return throwError(() => err);\n }),\n tap(params => {\n this.token = {\n ...params,\n type: OAuthType.CLIENT_CREDENTIAL,\n };\n }),\n ));\n }\n\n protected resourceLogin(parameters: ResourceParameters) {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n const {username, password} = parameters;\n return firstValueFrom(this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: OAuthType.RESOURCE,\n ...scope && {scope} || {},\n username,\n password\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n catchError(err => {\n this.token = err;\n return throwError(() => err);\n }),\n tap(params => {\n this.token = {\n ...params,\n type: OAuthType.RESOURCE,\n };\n })\n ));\n }\n\n protected async toAuthorizationUrl(parameters: AuthorizationParameters) {\n const {config} = this.authConfig as any;\n let authorizationUrl = `${config.authorizePath}`;\n authorizationUrl += config.authorizePath.includes('?') && '&' || '?';\n authorizationUrl += `client_id=${config.clientId}`;\n authorizationUrl += `&redirect_uri=${encodeURIComponent(parameters.redirectUri)}`;\n authorizationUrl += `&response_type=${parameters.responseType}`;\n authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;\n authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;\n return this.location.replace(`${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`);\n }\n\n protected async generateCodeChallenge(config: any) {\n if (config.pkce) {\n const codeVerifier = randomString();\n this.token = {...this.token, codeVerifier};\n return `&code_challenge=${await pkce(codeVerifier)}&code_challenge_method=S256`;\n }\n return '';\n }\n\n protected generateNonce(config: any) {\n if (config && config.scope && config.scope.indexOf('openid') > -1) {\n const nonce = randomString(10);\n this.token = {...this.token, nonce};\n return `&nonce=${nonce}`;\n }\n return '';\n }\n\n private checkResponse(token?: OAuthToken,\n parameters?: Record<string, string>) {\n this.emitState(parameters);\n this.cleanLocationHash();\n if (!parameters || parameters['error']) {\n return false;\n }\n if (token && token.nonce && parameters['access_token']) {\n const jwtToken = jwt(parameters['access_token']);\n return token.nonce === jwtToken.nonce;\n }\n return parameters['access_token'] || parameters['code'];\n }\n\n private getCleanedUnSearchParameters() {\n const {search} = this.location;\n let searchString = search && search.substring(1) || '';\n const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt'];\n hashKeys.forEach(hashKey => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n searchString = searchString.replace(re, '');\n });\n return searchString.length && `?${searchString}` || '';\n }\n\n private cleanLocationHash() {\n const {hash} = this.location;\n let curHash = hash && hash.substring(1) || '';\n const hashKeys = [\n 'access_token',\n 'token_type',\n 'expires_in',\n 'scope',\n 'state',\n 'error',\n 'error_description',\n 'session_state',\n 'nonce',\n 'id_token',\n 'code'\n ];\n hashKeys.forEach(hashKey => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n curHash = curHash.replace(re, '');\n });\n this.location.hash = curHash;\n }\n\n private emitState(parameters?: Record<string, string>) {\n const {state} = parameters || {};\n state && this.state$.next(state);\n }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpErrorResponse, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {switchMap, take, throwError} from 'rxjs';\nimport {catchError, map} from 'rxjs/operators';\nimport {OAuthConfig} from '../models';\nimport {TokenService} from './token.service';\n\n@Injectable()\nexport class OAuthInterceptor implements HttpInterceptor {\n\n constructor(protected tokenService: TokenService,\n protected authConfig: OAuthConfig) {\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler) {\n return this.isPathExcepted(req) && next.handle(req) || this.tokenService.token$.pipe(\n take(1),\n map(token => {\n if (token?.access_token) {\n req = req.clone({\n setHeaders: {\n Authorization: `${token.token_type} ${token.access_token}`\n }\n });\n }\n return req;\n }),\n switchMap(req => next.handle(req)),\n catchError((err: HttpErrorResponse) => {\n if (err.status === 401) {\n this.tokenService.token = {\n error: `${err.status}`,\n error_description: err.message\n };\n }\n return throwError(() => err);\n })\n );\n }\n\n private isPathExcepted(req: HttpRequest<any>) {\n const {ignorePaths} = this.authConfig || {};\n if (ignorePaths) {\n for (const ignorePath of ignorePaths) {\n try {\n if (req.url.match(ignorePath)) {\n return true;\n }\n } catch (err) {\n }\n }\n }\n return false;\n }\n}\n","import {Component, ContentChild, HostListener, Inject, Input, OnDestroy, Output, TemplateRef, ViewEncapsulation} from '@angular/core';\r\nimport {Observable, Subscription, take} from 'rxjs';\r\nimport {LOCATION, OAuthParameters, OAuthStatus, OAuthType} from '../../models';\r\nimport {tap} from 'rxjs/operators';\r\nimport {OAuthService} from '../../services/oauth.service';\r\nimport {Location as Location2} from '@angular/common';\r\n\r\nexport interface OAuthLoginI18n {\r\n username?: string;\r\n password?: string;\r\n submit?: string;\r\n notAuthorized?: string;\r\n authorized?: string;\r\n denied?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'oauth-login',\r\n templateUrl: 'oauth-login.component.html',\r\n styleUrls: ['oauth-login.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class OAuthLoginComponent implements OnDestroy {\r\n\r\n #subscription = new Subscription();\r\n #redirectUri?: string;\r\n #responseType?: string;\r\n #i18n: OAuthLoginI18n = {\r\n username: 'Username',\r\n password: 'Password',\r\n submit: 'Sign in',\r\n notAuthorized: 'Sign in',\r\n authorized: 'Welcome',\r\n denied: 'Access Denied. Try again!'\r\n };\r\n\r\n get i18n() {\r\n return this.#i18n;\r\n }\r\n\r\n @Input()\r\n type: OAuthType = OAuthType.RESOURCE;\r\n\r\n @Input()\r\n set i18n(i18n) {\r\n this.#i18n = {\r\n ...this.#i18n,\r\n ...i18n\r\n };\r\n }\r\n\r\n get redirectUri() {\r\n return this.#redirectUri || `${this.location.origin}${this.locationService.path(true) || '/'}`;\r\n }\r\n\r\n @Input()\r\n set redirectUri(redirectUri: string) {\r\n if (redirectUri) {\r\n this.#redirectUri = redirectUri;\r\n }\r\n }\r\n\r\n @Input()\r\n set responseType(responseType: string) {\r\n if (this.responseType) {\r\n this.#responseType = responseType;\r\n }\r\n }\r\n\r\n get responseType() {\r\n return this.#responseType || this.type;\r\n }\r\n\r\n @Input()\r\n useLogoutUrl = false;\r\n @Input()\r\n state = '';\r\n @Output()\r\n stateChange = this.oauthService.state$.asObservable();\r\n @Input()\r\n profileName$: Observable<string | undefined> | undefined;\r\n @ContentChild('login', {static: false})\r\n loginTemplate: TemplateRef<any> | undefined;\r\n username = '';\r\n password = '';\r\n profileName?: string;\r\n OAuthStatus = OAuthStatus;\r\n OAuthType = OAuthType;\r\n collapse = false;\r\n status$ = this.oauthService.status$.pipe(\r\n tap(s => {\r\n if (s === OAuthStatus.AUTHORIZED && this.profileName$) {\r\n this.#subscription.add(this.profileName$.pipe(\r\n take(1)\r\n ).subscribe(n => this.profileName = n));\r\n } else {\r\n const {token} = this.oauthService;\r\n const userInfo = token && token.id_token && JSON.parse(atob(token.id_token.split('.')[1])) || {};\r\n this.profileName = userInfo.name || userInfo.username || userInfo.email || userInfo.sub || '';\r\n }\r\n })\r\n );\r\n loginFunction = (p: OAuthParameters) => this.login(p);\r\n logoutFunction = () => this.logout();\r\n\r\n constructor(private oauthService: OAuthService,\r\n private locationService: Location2,\r\n @Inject(LOCATION) private location: Location) {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n logout() {\r\n this.oauthService.logout(this.useLogoutUrl);\r\n }\r\n\r\n login(parameters: OAuthParameters) {\r\n this.collapse = false;\r\n return this.oauthService.login(parameters);\r\n }\r\n\r\n toggleCollapse() {\r\n this.collapse = !this.collapse;\r\n }\r\n\r\n @HostListener('window:keydown.escape')\r\n keyboardEvent() {\r\n this.collapse = false;\r\n }\r\n}\r\n","<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\"\r\n #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\"\r\n class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + '&nbsp;'\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n","import {ModuleWithProviders, NgModule, Optional, PLATFORM_ID} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {HTTP_INTERCEPTORS, HttpBackend, HttpClient, HttpClientModule} from '@angular/common/http';\nimport {RouterModule} from '@angular/router';\nimport {LOCATION, OAUTH_HTTP_CLIENT, OAuthConfig, provideOAuthConfigFactory, SERVER_HOST, SERVER_PATH, STORAGE} from './models';\nimport {OAuthService} from './services/oauth.service';\nimport {OAuthLoginComponent} from './components/login/oauth-login.component';\nimport {CommonModule, isPlatformBrowser} from '@angular/common';\nimport {OAuthInterceptor} from './services/oauth.interceptor';\nimport {TokenService} from './services/token.service';\n\nconst mockLocation = (serverHost: string, serverPath: string): Location => {\n const url = new URL(serverHost && serverPath ? `${serverHost}${serverPath}` : 'http://localhost');\n const {href, origin, protocol, host, hostname, port, pathname, search, hash} = url;\n return {\n href, origin, protocol, host, hostname, port, pathname, search, hash,\n reload() {\n },\n assign(_: string) {\n },\n ancestorOrigins: {} as any,\n replace(_: string) {\n }\n };\n};\n\nconst LocationService = {\n provide: LOCATION,\n useFactory(platformId: Object, serverHost: string, serverPath: string) {\n return isPlatformBrowser(platformId) ? location : mockLocation(serverHost, serverPath);\n },\n deps: [\n PLATFORM_ID,\n [new Optional(), SERVER_HOST],\n [new Optional(), SERVER_PATH]\n ]\n};\n\nconst mockStorage: Storage = {\n clear() {\n },\n getItem(key: string) {\n return null;\n },\n key(index: number) {\n return null;\n },\n removeItem(key: string) {\n },\n setItem(key: string, value: string) {\n },\n length: 0\n};\n\nconst StorageService = {\n provide: STORAGE,\n useFactory(platformId: Object) {\n return isPlatformBrowser(platformId) ? localStorage : mockStorage;\n },\n deps: [PLATFORM_ID]\n};\n\nconst OAuthHttpClient = {\n provide: OAUTH_HTTP_CLIENT,\n useFactory(httpBackend: HttpBackend) {\n // avoid http interceptors\n return new HttpClient(httpBackend);\n },\n deps: [HttpBackend]\n};\n\nconst OAuthInterceptorService = {\n provide: HTTP_INTERCEPTORS,\n useClass: OAuthInterceptor,\n multi: true,\n};\n\nconst defaultConfig = (storage: Storage) => {\n return {\n storage,\n storageKey: 'token',\n ignorePaths: []\n };\n};\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n HttpClientModule,\n RouterModule,\n ],\n declarations: [OAuthLoginComponent],\n exports: [OAuthLoginComponent]\n})\nexport class OAuthModule {\n\n static forRoot(config: OAuthConfig = {}): ModuleWithProviders<OAuthModule> {\n return {\n ngModule: OAuthModule,\n providers: [\n LocationService,\n StorageService,\n OAuthHttpClient,\n provideOAuthConfigFactory((storage: Storage) => ({\n ...defaultConfig(storage),\n ...config\n }), [STORAGE]),\n TokenService,\n OAuthInterceptorService,\n OAuthService,\n ]\n };\n }\n}\n","/*\n * Public API Surface of ngx-oauth\n */\nexport * from './lib/models';\nexport * from './lib/services/oauth.service';\nexport * from './lib/services/oauth.interceptor';\nexport * from './lib/components/login/oauth-login.component';\nexport * from './lib/oauth.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["switchMap","i4","i1.TokenService","i2.OAuthConfig","i3"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-oauth.mjs","sources":["../../../projects/ngx-oauth/src/models/index.ts","../../../projects/ngx-oauth/src/services/token.service.ts","../../../projects/ngx-oauth/src/services/oauth.service.ts","../../../projects/ngx-oauth/src/services/oauth.interceptor.ts","../../../projects/ngx-oauth/src/components/login/oauth-login.component.ts","../../../projects/ngx-oauth/src/components/login/oauth-login.component.html","../../../projects/ngx-oauth/src/oauth.module.ts","../../../projects/ngx-oauth/src/index.ts","../../../projects/ngx-oauth/src/ngx-oauth.ts"],"sourcesContent":["import {FactoryProvider, inject, Injectable, InjectionToken, ValueProvider} from '@angular/core';\nimport {HttpClient, HttpHeaders} from '@angular/common/http';\n\nexport const SERVER_HOST = new InjectionToken<string>('SERVER_HOST');\nexport const SERVER_PATH = new InjectionToken<string>('SERVER_PATH');\nexport const LOCATION = new InjectionToken<Location>('Location');\nexport const STORAGE = new InjectionToken<Storage>('Storage');\nexport const OAUTH_CONFIG = new InjectionToken<OAuthConfig[]>('OAuthConfig');\nexport const OAUTH_TOKEN = new InjectionToken<OAuthToken>('OAuthToken');\nexport const HEADER_APPLICATION = new HttpHeaders({'Content-Type': 'application/x-www-form-urlencoded'});\nexport const OAUTH_HTTP_CLIENT = new InjectionToken<HttpClient>('OAuthHttpClient');\n\n@Injectable({\n providedIn: 'root',\n useFactory: () => inject(OAUTH_CONFIG).reduce((p, c) => ({...p, ...c}), {})\n})\nexport abstract class OAuthConfig {\n config?: OAuthTypeConfig;\n storageKey?: string;\n storage?: Storage;\n ignorePaths?: RegExp[];\n}\n\nexport const provideOAuthConfig = (config: OAuthConfig = {}): ValueProvider => ({\n provide: OAUTH_CONFIG,\n useValue: config,\n multi: true\n});\n\nexport const provideOAuthConfigFactory = (factory: Function, deps?: any[]): FactoryProvider => ({\n provide: OAUTH_CONFIG,\n useFactory: factory,\n deps: deps,\n multi: true\n});\n\nexport enum OAuthType {\n RESOURCE = 'password',\n AUTHORIZATION_CODE = 'code',\n IMPLICIT = 'token',\n CLIENT_CREDENTIAL = 'client_credentials'\n}\n\nexport interface ClientCredentialConfig {\n tokenPath: string;\n revokePath?: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\n// tslint:disable-next-line:no-empty-interface\nexport interface ResourceConfig extends ClientCredentialConfig {\n}\n\nexport interface ImplicitConfig {\n authorizePath: string;\n revokePath?: string;\n clientId: string;\n scope?: string;\n logoutPath?: string;\n logoutRedirectUri?: string;\n}\n\nexport interface AuthorizationCodeConfig extends ResourceConfig {\n authorizePath: string;\n}\n\nexport interface AuthorizationCodePKCEConfig extends AuthorizationCodeConfig {\n pkce: boolean;\n}\n\nexport interface OpenIdConfig {\n issuerPath: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\nexport interface ResourceParameters {\n username: string;\n password: string;\n}\n\nexport interface AuthorizationParameters {\n redirectUri: string;\n responseType: OAuthType.IMPLICIT | OAuthType.AUTHORIZATION_CODE | string;\n state?: string;\n}\n\nexport type OAuthParameters = ResourceParameters | AuthorizationParameters;\nexport type OAuthTypeConfig = OpenIdConfig\n | AuthorizationCodePKCEConfig\n | AuthorizationCodeConfig\n | ImplicitConfig\n | ResourceConfig\n | ClientCredentialConfig;\n\nexport interface OAuthToken {\n id_token?: string;\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n state?: string;\n error?: string;\n error_description?: string;\n expires_in?: number | string;\n refresh_expires_in?: number | string;\n scope?: string;\n codeVerifier?: string;\n nonce?: string;\n type?: OAuthType;\n expires?: number;\n \n [x: string]: any;\n}\n\nexport enum OAuthStatus {\n NOT_AUTHORIZED = 'NOT_AUTHORIZED',\n AUTHORIZED = 'AUTHORIZED',\n DENIED = 'DENIED'\n}\n\nexport interface OpenIdConfiguration {\n issuer?: string;\n authorization_endpoint?: string;\n introspection_endpoint?: string;\n token_endpoint?: string;\n userinfo_endpoint?: string;\n end_session_endpoint?: string;\n revocation_endpoint?: string;\n scopes_supported?: string[];\n code_challenge_methods_supported?: string[];\n}\n\nexport interface UserInfo {\n email?: string;\n email_verified?: boolean;\n family_name?: string;\n given_name?: string;\n name?: string;\n preferred_username?: string;\n sub?: string;\n address?: object;\n picture?: string;\n locale?: string;\n}\n\nexport interface IntrospectInfo extends UserInfo {\n active: boolean;\n scope: string;\n client_id?: string;\n username: string;\n exp: number;\n}\n","import {Inject, Injectable, NgZone} from '@angular/core';\nimport {BehaviorSubject, distinctUntilChanged, Observable, of, switchMap} from 'rxjs';\nimport {HEADER_APPLICATION, OAUTH_HTTP_CLIENT, OAuthConfig, OAuthToken} from '../models';\nimport {catchError, map, shareReplay} from 'rxjs/operators';\nimport {HttpClient, HttpParams} from '@angular/common/http';\n\nconst isExpiredToken = (token?: OAuthToken) => token && token.expires && Date.now() > token.expires || false;\n\n@Injectable()\nexport class OAuthTokenService {\n\n #token$ = new BehaviorSubject<OAuthToken>(this.saved);\n token$ = this.#token$.pipe(\n distinctUntilChanged((p, c) => JSON.stringify(p || null) === JSON.stringify(c || null)),\n shareReplay(1),\n switchMap(token => !isExpiredToken(token) && of(token) || this.refreshToken(token)),\n );\n type$ = this.token$.pipe(\n map(token => token?.type),\n shareReplay(1)\n );\n accessToken$ = this.token$.pipe(\n map(token => token?.access_token),\n shareReplay(1),\n );\n\n constructor(protected authConfig: OAuthConfig,\n @Inject(OAUTH_HTTP_CLIENT) protected http: HttpClient,\n protected zone: NgZone) {\n }\n\n get token() {\n return this.#token$.value;\n }\n\n set token(token) {\n const expiresIn = Number(token.expires_in) || 0;\n const result = {\n ...token,\n ...expiresIn && {expires: Date.now() + expiresIn * 1000} || {}\n };\n this.saved = result;\n this.#token$.next(result);\n }\n\n get saved() {\n const {storageKey, storage} = this.authConfig;\n return storageKey && storage && storage[storageKey] && JSON.parse(storage[storageKey]) || {};\n }\n\n set saved(token: OAuthToken) {\n const {storageKey, storage} = this.authConfig;\n if (storage && storageKey) {\n if (token) {\n storage[storageKey] = JSON.stringify(token);\n } else {\n delete storage[storageKey];\n }\n }\n }\n\n protected refreshToken(token?: OAuthToken): Observable<OAuthToken> {\n const {tokenPath, clientId, clientSecret, scope} = this.authConfig.config as any;\n const {refresh_token} = token || {};\n return tokenPath && refresh_token && this.http.post<OAuthToken>(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: 'refresh_token',\n refresh_token,\n ...scope && {scope} || {},\n }\n }), {\n headers: HEADER_APPLICATION\n }).pipe(\n catchError(() => {\n this.token = {};\n return of(this.token);\n }),\n map(token => {\n this.token = {\n ...this.token,\n ...token\n };\n return this.token;\n })\n ) || of(token);\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport {HttpClient, HttpParams} from '@angular/common/http';\nimport {catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap} from 'rxjs/operators';\nimport {firstValueFrom, from, noop, of, ReplaySubject, throwError} from 'rxjs';\nimport {\n AuthorizationCodeConfig,\n AuthorizationParameters,\n HEADER_APPLICATION,\n LOCATION,\n OAuthConfig,\n OAuthParameters,\n OAuthStatus,\n OAuthToken,\n OAuthType,\n OAuthTypeConfig,\n OpenIdConfig,\n OpenIdConfiguration,\n ResourceParameters,\n UserInfo\n} from '../models';\nimport {Location as Location2} from '@angular/common';\nimport {OAuthTokenService} from './token.service';\n\nconst arrToString = (buf: Uint8Array) => buf.reduce((s, b) => s + String.fromCharCode(b), '');\n\nconst base64url = (str: string) => btoa(str)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\nconst randomString = (length: number = 48) => {\n const buff = arrToString(crypto.getRandomValues(new Uint8Array(length * 2)));\n return base64url(buff).substring(0, length);\n};\n\nconst pkce = async (value: string) => {\n const buff = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));\n return base64url(arrToString(new Uint8Array(buff)));\n};\n\nconst parseOauthUri = (hash: string) => {\n const regex = /([^&=]+)=([^&]*)/g;\n const params: Record<string, string> = {};\n let m;\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = regex.exec(hash)) !== null) {\n params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);\n }\n return Object.keys(params).length && params || {};\n};\n\nconst jwt = (token: string) => JSON.parse(atob(token.split('.')[1]));\n\n@Injectable()\nexport class OAuthService {\n\n state$ = new ReplaySubject<string>(1);\n config$ = of(this.config).pipe(\n filter(Boolean),\n filter(config => !!config?.clientId),\n map(config => config as OpenIdConfig),\n switchMap(config => !config.issuerPath && of(config) || this.http.get<OpenIdConfiguration>(`${config.issuerPath}/.well-known/openid-configuration`).pipe(\n tap(v => this.config = {\n ...v.authorization_endpoint && {authorizePath: v.authorization_endpoint} || {},\n ...v.token_endpoint && {tokenPath: v.token_endpoint} || {},\n ...v.revocation_endpoint && {revokePath: v.revocation_endpoint} || {},\n ...v.code_challenge_methods_supported && {pkce: v.code_challenge_methods_supported.indexOf('S256') > -1} || {},\n ...v.userinfo_endpoint && {userPath: v.userinfo_endpoint} || {},\n ...v.introspection_endpoint && {introspectionPath: v.introspection_endpoint} || {},\n ...v.end_session_endpoint && {logoutPath: v.end_session_endpoint} || {},\n ...{scope: config.scope || 'openid'}\n } as any),\n map(() => this.config)\n )),\n shareReplay(1)\n );\n token$ = this.config$.pipe(\n tap(config => {\n const {hash, search, origin, pathname} = this.location;\n const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);\n const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search) || hash && /(code=)|(error=)/.test(hash);\n if (isImplicitRedirect) {\n const parameters = parseOauthUri(hash.substring(1));\n this.token = {\n ...parameters,\n type: OAuthType.IMPLICIT,\n };\n this.checkResponse(this.token, parameters);\n } else if (isAuthCodeRedirect) {\n const parameters = parseOauthUri(search && search.substring(1) || hash && hash.substring(1));\n if (!this.checkResponse(this.token, parameters)) {\n this.token = parameters;\n } else {\n const newParametersString = this.getCleanedUnSearchParameters();\n const {clientId, clientSecret, tokenPath, scope} = config as AuthorizationCodeConfig;\n const {codeVerifier} = this.token || {}; //should be set by authorizationUrl construction\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n code: parameters?.['code'],\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n redirect_uri: `${origin}${pathname}`,\n grant_type: 'authorization_code',\n ...scope && {scope} || {},\n ...codeVerifier && {code_verifier: codeVerifier} || {}\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n ).subscribe(token => {\n this.token = {\n ...token,\n type: OAuthType.AUTHORIZATION_CODE\n };\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n });\n }\n }\n }),\n switchMap(() => this.tokenService.token$),\n shareReplay(1)\n );\n status$ = this.token$.pipe(\n map(token => token.access_token && OAuthStatus.AUTHORIZED || token.error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED),\n shareReplay(1)\n );\n userInfo$ = this.status$.pipe(\n filter(s => s === OAuthStatus.AUTHORIZED),\n map(() => (this.config as any).userPath),\n filter(Boolean),\n switchMap(path => this.getUserInfo(path)),\n shareReplay(1)\n );\n type$ = this.tokenService.type$;\n ignorePaths = this.authConfig.ignorePaths || [];\n\n get storageKey() {\n return this.authConfig.storageKey;\n }\n\n set storageKey(storageKey) {\n if (storageKey) {\n this.authConfig.storageKey = storageKey;\n this.tokenService.token = this.tokenService.saved;\n }\n }\n\n get token() {\n return this.tokenService.token;\n }\n\n set token(token) {\n this.tokenService.token = token;\n }\n\n get config() {\n return this.authConfig.config;\n }\n\n set config(config: OAuthTypeConfig | undefined) {\n if (config) {\n this.authConfig.config = {\n ...this.authConfig.config,\n ...config\n };\n }\n }\n\n constructor(protected authConfig: OAuthConfig,\n protected tokenService: OAuthTokenService,\n protected http: HttpClient,\n @Inject(LOCATION) protected location: Location,\n protected locationService: Location2) {\n }\n\n async login(parameters?: OAuthParameters) {\n if (!!parameters && (parameters as ResourceParameters).password) {\n await this.resourceLogin(parameters as ResourceParameters);\n } else if (!!parameters && (parameters as AuthorizationParameters).redirectUri && (parameters as AuthorizationParameters).responseType\n ) {\n await this.toAuthorizationUrl(parameters as AuthorizationParameters);\n } else {\n await this.clientCredentialLogin();\n }\n }\n\n logout(useLogoutUrl?: boolean) {\n this.revoke();\n this.token = {};\n const {logoutPath, logoutRedirectUri} = this.authConfig.config as any;\n if (useLogoutUrl && logoutPath) {\n const {origin, pathname} = this.location;\n const currentPath = `${origin}${pathname}`;\n this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);\n }\n }\n\n getUserInfo(path?: string) {\n const {userPath} = this.config as any;\n return this.http.get<UserInfo>(path || userPath);\n }\n\n protected revoke() {\n const {revokePath, clientId, clientSecret} = this.authConfig.config as any;\n if (revokePath) {\n const {access_token, refresh_token} = this.token || {};\n const toRevoke = [];\n if (access_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: access_token,\n token_type_hint: 'access_token'\n });\n }\n if (refresh_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: refresh_token,\n token_type_hint: 'refresh_token'\n });\n }\n from(toRevoke).pipe(\n concatMap(o => of(o).pipe(delay(300))), // space request to avoid cancellation\n switchMap(o => this.http.post(revokePath, new HttpParams({fromObject: o}))),\n ).subscribe(noop);\n }\n }\n\n protected clientCredentialLogin() {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n return firstValueFrom(this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n client_secret: clientSecret,\n grant_type: OAuthType.CLIENT_CREDENTIAL,\n ...scope ? {scope} : {},\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n catchError((err) => {\n this.token = err;\n return throwError(() => err);\n }),\n tap(params => {\n this.token = {\n ...params,\n type: OAuthType.CLIENT_CREDENTIAL,\n };\n }),\n ));\n }\n\n protected resourceLogin(parameters: ResourceParameters) {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n const {username, password} = parameters;\n return firstValueFrom(this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: OAuthType.RESOURCE,\n ...scope && {scope} || {},\n username,\n password\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n catchError(err => {\n this.token = err;\n return throwError(() => err);\n }),\n tap(params => {\n this.token = {\n ...params,\n type: OAuthType.RESOURCE,\n };\n })\n ));\n }\n\n protected async toAuthorizationUrl(parameters: AuthorizationParameters) {\n const {config} = this.authConfig as any;\n let authorizationUrl = `${config.authorizePath}`;\n authorizationUrl += config.authorizePath.includes('?') && '&' || '?';\n authorizationUrl += `client_id=${config.clientId}`;\n authorizationUrl += `&redirect_uri=${encodeURIComponent(parameters.redirectUri)}`;\n authorizationUrl += `&response_type=${parameters.responseType}`;\n authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;\n authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;\n return this.location.replace(`${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`);\n }\n\n protected async generateCodeChallenge(config: any) {\n if (config.pkce) {\n const codeVerifier = randomString();\n this.token = {...this.token, codeVerifier};\n return `&code_challenge=${await pkce(codeVerifier)}&code_challenge_method=S256`;\n }\n return '';\n }\n\n protected generateNonce(config: any) {\n if (config && config.scope && config.scope.indexOf('openid') > -1) {\n const nonce = randomString(10);\n this.token = {...this.token, nonce};\n return `&nonce=${nonce}`;\n }\n return '';\n }\n\n private checkResponse(token?: OAuthToken,\n parameters?: Record<string, string>) {\n this.emitState(parameters);\n this.cleanLocationHash();\n if (!parameters || parameters['error']) {\n return false;\n }\n if (token && token.nonce && parameters['access_token']) {\n const jwtToken = jwt(parameters['access_token']);\n return token.nonce === jwtToken.nonce;\n }\n return parameters['access_token'] || parameters['code'];\n }\n\n private getCleanedUnSearchParameters() {\n const {search} = this.location;\n let searchString = search && search.substring(1) || '';\n const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt'];\n hashKeys.forEach(hashKey => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n searchString = searchString.replace(re, '');\n });\n return searchString.length && `?${searchString}` || '';\n }\n\n private cleanLocationHash() {\n const {hash} = this.location;\n let curHash = hash && hash.substring(1) || '';\n const hashKeys = [\n 'access_token',\n 'token_type',\n 'expires_in',\n 'scope',\n 'state',\n 'error',\n 'error_description',\n 'session_state',\n 'nonce',\n 'id_token',\n 'code'\n ];\n hashKeys.forEach(hashKey => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n curHash = curHash.replace(re, '');\n });\n this.location.hash = curHash;\n }\n\n private emitState(parameters?: Record<string, string>) {\n const {state} = parameters || {};\n state && this.state$.next(state);\n }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpErrorResponse, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {switchMap, take, throwError} from 'rxjs';\nimport {catchError, map} from 'rxjs/operators';\nimport {OAuthConfig} from '../models';\nimport {OAuthTokenService} from './token.service';\n\n@Injectable()\nexport class OAuthInterceptor implements HttpInterceptor {\n\n constructor(protected tokenService: OAuthTokenService,\n protected authConfig: OAuthConfig) {\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler) {\n return this.isPathExcepted(req) && next.handle(req) || this.tokenService.token$.pipe(\n take(1),\n map(token => {\n if (token?.access_token) {\n req = req.clone({\n setHeaders: {\n Authorization: `${token.token_type} ${token.access_token}`\n }\n });\n }\n return req;\n }),\n switchMap(req => next.handle(req)),\n catchError((err: HttpErrorResponse) => {\n if (err.status === 401) {\n this.tokenService.token = {\n error: `${err.status}`,\n error_description: err.message\n };\n }\n return throwError(() => err);\n })\n );\n }\n\n private isPathExcepted(req: HttpRequest<any>) {\n const {ignorePaths} = this.authConfig || {};\n if (ignorePaths) {\n for (const ignorePath of ignorePaths) {\n try {\n if (req.url.match(ignorePath)) {\n return true;\n }\n } catch (err) {\n }\n }\n }\n return false;\n }\n}\n","import {Component, ContentChild, HostListener, Inject, Input, OnDestroy, Output, TemplateRef, ViewEncapsulation} from '@angular/core';\r\nimport {Observable, Subscription, take} from 'rxjs';\r\nimport {LOCATION, OAuthParameters, OAuthStatus, OAuthType} from '../../models';\r\nimport {tap} from 'rxjs/operators';\r\nimport {OAuthService} from '../../services/oauth.service';\r\nimport {Location as Location2} from '@angular/common';\r\n\r\nexport interface OAuthLoginI18n {\r\n username?: string;\r\n password?: string;\r\n submit?: string;\r\n notAuthorized?: string;\r\n authorized?: string;\r\n denied?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'oauth-login',\r\n templateUrl: 'oauth-login.component.html',\r\n styleUrls: ['oauth-login.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class OAuthLoginComponent implements OnDestroy {\r\n\r\n #subscription = new Subscription();\r\n #redirectUri?: string;\r\n #responseType?: string;\r\n #i18n: OAuthLoginI18n = {\r\n username: 'Username',\r\n password: 'Password',\r\n submit: 'Sign in',\r\n notAuthorized: 'Sign in',\r\n authorized: 'Welcome',\r\n denied: 'Access Denied. Try again!'\r\n };\r\n\r\n get i18n() {\r\n return this.#i18n;\r\n }\r\n\r\n @Input()\r\n type: OAuthType = OAuthType.RESOURCE;\r\n\r\n @Input()\r\n set i18n(i18n) {\r\n this.#i18n = {\r\n ...this.#i18n,\r\n ...i18n\r\n };\r\n }\r\n\r\n get redirectUri() {\r\n return this.#redirectUri || `${this.location.origin}${this.locationService.path(true) || '/'}`;\r\n }\r\n\r\n @Input()\r\n set redirectUri(redirectUri: string) {\r\n if (redirectUri) {\r\n this.#redirectUri = redirectUri;\r\n }\r\n }\r\n\r\n @Input()\r\n set responseType(responseType: string) {\r\n if (this.responseType) {\r\n this.#responseType = responseType;\r\n }\r\n }\r\n\r\n get responseType() {\r\n return this.#responseType || this.type;\r\n }\r\n\r\n @Input()\r\n useLogoutUrl = false;\r\n @Input()\r\n state = '';\r\n @Output()\r\n stateChange = this.oauthService.state$.asObservable();\r\n @Input()\r\n profileName$: Observable<string | undefined> | undefined;\r\n @ContentChild('login', {static: false})\r\n loginTemplate: TemplateRef<any> | undefined;\r\n username = '';\r\n password = '';\r\n profileName?: string;\r\n OAuthStatus = OAuthStatus;\r\n OAuthType = OAuthType;\r\n collapse = false;\r\n status$ = this.oauthService.status$.pipe(\r\n tap(s => {\r\n if (s === OAuthStatus.AUTHORIZED && this.profileName$) {\r\n this.#subscription.add(this.profileName$.pipe(\r\n take(1)\r\n ).subscribe(n => this.profileName = n));\r\n } else {\r\n const {token} = this.oauthService;\r\n const userInfo = token && token.id_token && JSON.parse(atob(token.id_token.split('.')[1])) || {};\r\n this.profileName = userInfo.name || userInfo.username || userInfo.email || userInfo.sub || '';\r\n }\r\n })\r\n );\r\n loginFunction = (p: OAuthParameters) => this.login(p);\r\n logoutFunction = () => this.logout();\r\n\r\n constructor(private oauthService: OAuthService,\r\n private locationService: Location2,\r\n @Inject(LOCATION) private location: Location) {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n logout() {\r\n this.oauthService.logout(this.useLogoutUrl);\r\n }\r\n\r\n login(parameters: OAuthParameters) {\r\n this.collapse = false;\r\n return this.oauthService.login(parameters);\r\n }\r\n\r\n toggleCollapse() {\r\n this.collapse = !this.collapse;\r\n }\r\n\r\n @HostListener('window:keydown.escape')\r\n keyboardEvent() {\r\n this.collapse = false;\r\n }\r\n}\r\n","<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\"\r\n #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\"\r\n class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + '&nbsp;'\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n","import {ModuleWithProviders, NgModule, Optional, PLATFORM_ID} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {HTTP_INTERCEPTORS, HttpBackend, HttpClient, HttpClientModule} from '@angular/common/http';\nimport {RouterModule} from '@angular/router';\nimport {LOCATION, OAUTH_HTTP_CLIENT, OAuthConfig, provideOAuthConfigFactory, SERVER_HOST, SERVER_PATH, STORAGE} from './models';\nimport {OAuthService} from './services/oauth.service';\nimport {OAuthLoginComponent} from './components/login/oauth-login.component';\nimport {CommonModule, isPlatformBrowser} from '@angular/common';\nimport {OAuthInterceptor} from './services/oauth.interceptor';\nimport {OAuthTokenService} from './services/token.service';\n\nconst mockLocation = (serverHost: string, serverPath: string): Location => {\n const url = new URL(serverHost && serverPath ? `${serverHost}${serverPath}` : 'http://localhost');\n const {href, origin, protocol, host, hostname, port, pathname, search, hash} = url;\n return {\n href, origin, protocol, host, hostname, port, pathname, search, hash,\n reload() {\n },\n assign(_: string) {\n },\n ancestorOrigins: {} as any,\n replace(_: string) {\n }\n };\n};\n\nconst LocationService = {\n provide: LOCATION,\n useFactory(platformId: Object, serverHost: string, serverPath: string) {\n return isPlatformBrowser(platformId) ? location : mockLocation(serverHost, serverPath);\n },\n deps: [\n PLATFORM_ID,\n [new Optional(), SERVER_HOST],\n [new Optional(), SERVER_PATH]\n ]\n};\n\nconst mockStorage: Storage = {\n clear() {\n },\n getItem(key: string) {\n return null;\n },\n key(index: number) {\n return null;\n },\n removeItem(key: string) {\n },\n setItem(key: string, value: string) {\n },\n length: 0\n};\n\nconst StorageService = {\n provide: STORAGE,\n useFactory(platformId: Object) {\n return isPlatformBrowser(platformId) ? localStorage : mockStorage;\n },\n deps: [PLATFORM_ID]\n};\n\nconst OAuthHttpClient = {\n provide: OAUTH_HTTP_CLIENT,\n useFactory(httpBackend: HttpBackend) {\n // avoid http interceptors\n return new HttpClient(httpBackend);\n },\n deps: [HttpBackend]\n};\n\nconst OAuthInterceptorService = {\n provide: HTTP_INTERCEPTORS,\n useClass: OAuthInterceptor,\n multi: true,\n};\n\nconst defaultConfig = (storage: Storage) => {\n return {\n storage,\n storageKey: 'token',\n ignorePaths: []\n };\n};\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n HttpClientModule,\n RouterModule,\n ],\n declarations: [OAuthLoginComponent],\n exports: [OAuthLoginComponent]\n})\nexport class OAuthModule {\n\n static forRoot(config: OAuthConfig = {}): ModuleWithProviders<OAuthModule> {\n return {\n ngModule: OAuthModule,\n providers: [\n LocationService,\n StorageService,\n OAuthHttpClient,\n provideOAuthConfigFactory((storage: Storage) => ({\n ...defaultConfig(storage),\n ...config\n }), [STORAGE]),\n OAuthTokenService,\n OAuthInterceptorService,\n OAuthService,\n ]\n };\n }\n}\n","/*\n * Public API Surface of ngx-oauth\n */\nexport * from './models';\nexport * from './services/token.service';\nexport * from './services/oauth.service';\nexport * from './services/oauth.interceptor';\nexport * from './components/login/oauth-login.component';\nexport * from './oauth.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["switchMap","i4","i1.OAuthTokenService","i2.OAuthConfig","i3"],"mappings":";;;;;;;;;;;;;MAGa,WAAW,GAAG,IAAI,cAAc,CAAS,aAAa,EAAE;MACxD,WAAW,GAAG,IAAI,cAAc,CAAS,aAAa,EAAE;MACxD,QAAQ,GAAG,IAAI,cAAc,CAAW,UAAU,EAAE;MACpD,OAAO,GAAG,IAAI,cAAc,CAAU,SAAS,EAAE;MACjD,YAAY,GAAG,IAAI,cAAc,CAAgB,aAAa,EAAE;MAChE,WAAW,GAAG,IAAI,cAAc,CAAa,YAAY,EAAE;AACjE,MAAM,kBAAkB,GAAG,IAAI,WAAW,CAAC,EAAC,cAAc,EAAE,mCAAmC,EAAC,EAAE;MAC5F,iBAAiB,GAAG,IAAI,cAAc,CAAa,iBAAiB,EAAE;MAM7D,WAAW,CAAA;;wGAAX,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAX,WAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,EAHnB,UAAA,EAAA,MAAM,EACN,UAAA,EAAA,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAC,CAAC,EAAE,EAAE,CAAC,EAAA,CAAA,CAAA;2FAEvD,WAAW,EAAA,UAAA,EAAA,CAAA;kBAJhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AAClB,oBAAA,UAAU,EAAE,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAC,CAAC,EAAE,EAAE,CAAC;AAC5E,iBAAA,CAAA;;AAQY,MAAA,kBAAkB,GAAG,CAAC,SAAsB,EAAE,MAAqB;AAC9E,IAAA,OAAO,EAAE,YAAY;AACrB,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,KAAK,EAAE,IAAI;AACZ,CAAA,EAAE;AAEU,MAAA,yBAAyB,GAAG,CAAC,OAAiB,EAAE,IAAY,MAAuB;AAC9F,IAAA,OAAO,EAAE,YAAY;AACrB,IAAA,UAAU,EAAE,OAAO;AACnB,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,KAAK,EAAE,IAAI;AACZ,CAAA,EAAE;IAES,UAKX;AALD,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB,IAAA,SAAA,CAAA,oBAAA,CAAA,GAAA,MAA2B,CAAA;AAC3B,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,OAAkB,CAAA;AAClB,IAAA,SAAA,CAAA,mBAAA,CAAA,GAAA,oBAAwC,CAAA;AAC1C,CAAC,EALW,SAAS,KAAT,SAAS,GAKpB,EAAA,CAAA,CAAA,CAAA;IA4EW,YAIX;AAJD,CAAA,UAAY,WAAW,EAAA;AACrB,IAAA,WAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC,CAAA;AACjC,IAAA,WAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,WAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACnB,CAAC,EAJW,WAAW,KAAX,WAAW,GAItB,EAAA,CAAA,CAAA;;;ACnHD,MAAM,cAAc,GAAG,CAAC,KAAkB,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;MAGhG,iBAAiB,CAAA;AAiB5B,IAAA,WAAA,CAAsB,UAAuB,EACI,IAAgB,EAC3C,IAAY,EAAA;QAFZ,IAAU,CAAA,UAAA,GAAV,UAAU,CAAa;QACI,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAY;QAC3C,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;AAjBlC,QAAA,yBAAA,CAAA,GAAA,CAAA,IAAA,EAAU,IAAI,eAAe,CAAa,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;AACtD,QAAA,IAAA,CAAA,MAAM,GAAG,sBAAA,CAAA,IAAI,EAAA,yBAAA,EAAA,GAAA,CAAQ,CAAC,IAAI,CACxB,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EACvF,WAAW,CAAC,CAAC,CAAC,EACd,SAAS,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CACpF,CAAC;QACF,IAAK,CAAA,KAAA,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CACtB,GAAG,CAAC,KAAK,IAAI,KAAK,EAAE,IAAI,CAAC,EACzB,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;QACF,IAAY,CAAA,YAAA,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAC7B,GAAG,CAAC,KAAK,IAAI,KAAK,EAAE,YAAY,CAAC,EACjC,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;KAKD;AAED,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,sBAAA,CAAA,IAAI,EAAQ,yBAAA,EAAA,GAAA,CAAA,CAAC,KAAK,CAAC;KAC3B;IAED,IAAI,KAAK,CAAC,KAAK,EAAA;QACb,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAChD,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,GAAG,KAAK;AACR,YAAA,GAAG,SAAS,IAAI,EAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,EAAC,IAAI,EAAE;SAC/D,CAAC;AACF,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;AACpB,QAAA,sBAAA,CAAA,IAAI,EAAQ,yBAAA,EAAA,GAAA,CAAA,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KAC3B;AAED,IAAA,IAAI,KAAK,GAAA;QACP,MAAM,EAAC,UAAU,EAAE,OAAO,EAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QAC9C,OAAO,UAAU,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;KAC9F;IAED,IAAI,KAAK,CAAC,KAAiB,EAAA;QACzB,MAAM,EAAC,UAAU,EAAE,OAAO,EAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QAC9C,IAAI,OAAO,IAAI,UAAU,EAAE;AACzB,YAAA,IAAI,KAAK,EAAE;gBACT,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC7C,aAAA;AAAM,iBAAA;AACL,gBAAA,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;AAC5B,aAAA;AACF,SAAA;KACF;AAES,IAAA,YAAY,CAAC,KAAkB,EAAA;AACvC,QAAA,MAAM,EAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAa,CAAC;AACjF,QAAA,MAAM,EAAC,aAAa,EAAC,GAAG,KAAK,IAAI,EAAE,CAAC;AACpC,QAAA,OAAO,SAAS,IAAI,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAa,SAAS,EAAE,IAAI,UAAU,CAAC;AACxF,YAAA,UAAU,EAAE;AACV,gBAAA,SAAS,EAAE,QAAQ;gBACnB,GAAG,YAAY,IAAI,EAAC,aAAa,EAAE,YAAY,EAAC,IAAI,EAAE;AACtD,gBAAA,UAAU,EAAE,eAAe;gBAC3B,aAAa;AACb,gBAAA,GAAG,KAAK,IAAI,EAAC,KAAK,EAAC,IAAI,EAAE;AAC1B,aAAA;AACF,SAAA,CAAC,EAAE;AACF,YAAA,OAAO,EAAE,kBAAkB;AAC5B,SAAA,CAAC,CAAC,IAAI,CACL,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;AAChB,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxB,SAAC,CAAC,EACF,GAAG,CAAC,KAAK,IAAG;YACV,IAAI,CAAC,KAAK,GAAG;gBACX,GAAG,IAAI,CAAC,KAAK;AACb,gBAAA,GAAG,KAAK;aACT,CAAC;YACF,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,SAAC,CAAC,CACH,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;KAChB;;;AA9EU,iBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,0CAkBR,iBAAiB,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAlB1B,iBAAiB,EAAA,CAAA,CAAA;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;;0BAmBI,MAAM;2BAAC,iBAAiB,CAAA;;;ACJvC,MAAM,WAAW,GAAG,CAAC,GAAe,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAE9F,MAAM,SAAS,GAAG,CAAC,GAAW,KAAK,IAAI,CAAC,GAAG,CAAC;AACzC,KAAA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AACnB,KAAA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AACnB,KAAA,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAErB,MAAM,YAAY,GAAG,CAAC,MAAiB,GAAA,EAAE,KAAI;AAC3C,IAAA,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,OAAO,KAAa,KAAI;IACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAY,KAAI;IACrC,MAAM,KAAK,GAAG,mBAAmB,CAAC;IAClC,MAAM,MAAM,GAA2B,EAAE,CAAC;AAC1C,IAAA,IAAI,CAAC,CAAC;;AAEN,IAAA,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE;AACtC,QAAA,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,KAAA;AACD,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,MAAM,IAAI,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,GAAG,GAAG,CAAC,KAAa,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAGxD,YAAY,CAAA;IAgHvB,WAAsB,CAAA,UAAuB,EACvB,YAA+B,EAC/B,IAAgB,EACE,QAAkB,EACpC,eAA0B,EAAA;QAJ1B,IAAU,CAAA,UAAA,GAAV,UAAU,CAAa;QACvB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAmB;QAC/B,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAY;QACE,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAU;QACpC,IAAe,CAAA,eAAA,GAAf,eAAe,CAAW;AAlHhD,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,aAAa,CAAS,CAAC,CAAC,CAAC;AACtC,QAAA,IAAA,CAAA,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAC5B,MAAM,CAAC,OAAO,CAAC,EACf,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,EACpC,GAAG,CAAC,MAAM,IAAI,MAAsB,CAAC,EACrCA,WAAS,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAsB,CAAA,EAAG,MAAM,CAAC,UAAU,CAAmC,iCAAA,CAAA,CAAC,CAAC,IAAI,CACtJ,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG;AACrB,YAAA,GAAG,CAAC,CAAC,sBAAsB,IAAI,EAAC,aAAa,EAAE,CAAC,CAAC,sBAAsB,EAAC,IAAI,EAAE;AAC9E,YAAA,GAAG,CAAC,CAAC,cAAc,IAAI,EAAC,SAAS,EAAE,CAAC,CAAC,cAAc,EAAC,IAAI,EAAE;AAC1D,YAAA,GAAG,CAAC,CAAC,mBAAmB,IAAI,EAAC,UAAU,EAAE,CAAC,CAAC,mBAAmB,EAAC,IAAI,EAAE;YACrE,GAAG,CAAC,CAAC,gCAAgC,IAAI,EAAC,IAAI,EAAE,CAAC,CAAC,gCAAgC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,EAAE;AAC9G,YAAA,GAAG,CAAC,CAAC,iBAAiB,IAAI,EAAC,QAAQ,EAAE,CAAC,CAAC,iBAAiB,EAAC,IAAI,EAAE;AAC/D,YAAA,GAAG,CAAC,CAAC,sBAAsB,IAAI,EAAC,iBAAiB,EAAE,CAAC,CAAC,sBAAsB,EAAC,IAAI,EAAE;AAClF,YAAA,GAAG,CAAC,CAAC,oBAAoB,IAAI,EAAC,UAAU,EAAE,CAAC,CAAC,oBAAoB,EAAC,IAAI,EAAE;YACvE,GAAG,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ,EAAC;AAC9B,SAAA,CAAC,EACT,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CACvB,CAAC,EACF,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;QACF,IAAM,CAAA,MAAA,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CACxB,GAAG,CAAC,MAAM,IAAG;AACX,YAAA,MAAM,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;YACvD,MAAM,kBAAkB,GAAG,IAAI,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzE,YAAA,MAAM,kBAAkB,GAAG,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9G,YAAA,IAAI,kBAAkB,EAAE;gBACtB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,KAAK,GAAG;AACX,oBAAA,GAAG,UAAU;oBACb,IAAI,EAAE,SAAS,CAAC,QAAQ;iBACzB,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AAC5C,aAAA;AAAM,iBAAA,IAAI,kBAAkB,EAAE;gBAC7B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7F,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE;AAC/C,oBAAA,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;AACzB,iBAAA;AAAM,qBAAA;AACL,oBAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC;oBAChE,MAAM,EAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAC,GAAG,MAAiC,CAAC;oBACrF,MAAM,EAAC,YAAY,EAAC,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;oBACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,UAAU,CAAC;AACvC,wBAAA,UAAU,EAAE;AACV,4BAAA,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;AAC1B,4BAAA,SAAS,EAAE,QAAQ;4BACnB,GAAG,YAAY,IAAI,EAAC,aAAa,EAAE,YAAY,EAAC,IAAI,EAAE;AACtD,4BAAA,YAAY,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,QAAQ,CAAE,CAAA;AACpC,4BAAA,UAAU,EAAE,oBAAoB;AAChC,4BAAA,GAAG,KAAK,IAAI,EAAC,KAAK,EAAC,IAAI,EAAE;4BACzB,GAAG,YAAY,IAAI,EAAC,aAAa,EAAE,YAAY,EAAC,IAAI,EAAE;AACvD,yBAAA;AACF,qBAAA,CAAC,EAAE,EAAC,OAAO,EAAE,kBAAkB,EAAC,CAAC,CAAC,IAAI,EACtC,CAAC,SAAS,CAAC,KAAK,IAAG;wBAClB,IAAI,CAAC,KAAK,GAAG;AACX,4BAAA,GAAG,KAAK;4BACR,IAAI,EAAE,SAAS,CAAC,kBAAkB;yBACnC,CAAC;wBACF,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAG,EAAA,QAAQ,CAAG,EAAA,mBAAmB,CAAE,CAAA,CAAC,CAAC;AACzE,qBAAC,CAAC,CAAC;AACJ,iBAAA;AACF,aAAA;AACH,SAAC,CAAC,EACFA,WAAS,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EACzC,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AACF,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CACxB,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY,IAAI,WAAW,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,cAAc,CAAC,EAC7H,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;QACF,IAAS,CAAA,SAAA,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAC3B,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,UAAU,CAAC,EACzC,GAAG,CAAC,MAAO,IAAI,CAAC,MAAc,CAAC,QAAQ,CAAC,EACxC,MAAM,CAAC,OAAO,CAAC,EACfA,WAAS,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EACzC,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AACF,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAChC,IAAW,CAAA,WAAA,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC;KAuC/C;AArCD,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;KACnC;IAED,IAAI,UAAU,CAAC,UAAU,EAAA;AACvB,QAAA,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC;YACxC,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACnD,SAAA;KACF;AAED,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;KAChC;IAED,IAAI,KAAK,CAAC,KAAK,EAAA;AACb,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;KACjC;AAED,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;KAC/B;IAED,IAAI,MAAM,CAAC,MAAmC,EAAA;AAC5C,QAAA,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG;AACvB,gBAAA,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;AACzB,gBAAA,GAAG,MAAM;aACV,CAAC;AACH,SAAA;KACF;IASD,MAAM,KAAK,CAAC,UAA4B,EAAA;AACtC,QAAA,IAAI,CAAC,CAAC,UAAU,IAAK,UAAiC,CAAC,QAAQ,EAAE;AAC/D,YAAA,MAAM,IAAI,CAAC,aAAa,CAAC,UAAgC,CAAC,CAAC;AAC5D,SAAA;aAAM,IAAI,CAAC,CAAC,UAAU,IAAK,UAAsC,CAAC,WAAW,IAAK,UAAsC,CAAC,YAAY,EACpI;AACA,YAAA,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAqC,CAAC,CAAC;AACtE,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;AACpC,SAAA;KACF;AAED,IAAA,MAAM,CAAC,YAAsB,EAAA;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;AACd,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,MAAM,EAAC,UAAU,EAAE,iBAAiB,EAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAa,CAAC;QACtE,IAAI,YAAY,IAAI,UAAU,EAAE;YAC9B,MAAM,EAAC,MAAM,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;AACzC,YAAA,MAAM,WAAW,GAAG,CAAA,EAAG,MAAM,CAAG,EAAA,QAAQ,EAAE,CAAC;AAC3C,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA,EAAG,UAAU,CAAA,0BAAA,EAA6B,iBAAiB,IAAI,WAAW,CAAA,CAAE,CAAC,CAAC;AACrG,SAAA;KACF;AAED,IAAA,WAAW,CAAC,IAAa,EAAA;AACvB,QAAA,MAAM,EAAC,QAAQ,EAAC,GAAG,IAAI,CAAC,MAAa,CAAC;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAW,IAAI,IAAI,QAAQ,CAAC,CAAC;KAClD;IAES,MAAM,GAAA;AACd,QAAA,MAAM,EAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAa,CAAC;AAC3E,QAAA,IAAI,UAAU,EAAE;YACd,MAAM,EAAC,YAAY,EAAE,aAAa,EAAC,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACvD,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,YAAA,IAAI,YAAY,EAAE;gBAChB,QAAQ,CAAC,IAAI,CAAC;oBACZ,GAAG,QAAQ,IAAI,EAAC,SAAS,EAAE,QAAQ,EAAC,IAAI,EAAE;oBAC1C,GAAG,YAAY,IAAI,EAAC,aAAa,EAAE,YAAY,EAAC,IAAI,EAAE;AACtD,oBAAA,KAAK,EAAE,YAAY;AACnB,oBAAA,eAAe,EAAE,cAAc;AAChC,iBAAA,CAAC,CAAC;AACJ,aAAA;AACD,YAAA,IAAI,aAAa,EAAE;gBACjB,QAAQ,CAAC,IAAI,CAAC;oBACZ,GAAG,QAAQ,IAAI,EAAC,SAAS,EAAE,QAAQ,EAAC,IAAI,EAAE;oBAC1C,GAAG,YAAY,IAAI,EAAC,aAAa,EAAE,YAAY,EAAC,IAAI,EAAE;AACtD,oBAAA,KAAK,EAAE,aAAa;AACpB,oBAAA,eAAe,EAAE,eAAe;AACjC,iBAAA,CAAC,CAAC;AACJ,aAAA;YACD,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CACjB,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACtC,YAAAA,WAAS,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,UAAU,CAAC,EAAC,UAAU,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC,CAC5E,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACnB,SAAA;KACF;IAES,qBAAqB,GAAA;AAC7B,QAAA,MAAM,EAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAa,CAAC;AACjF,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,UAAU,CAAC;AAC7D,YAAA,UAAU,EAAE;AACV,gBAAA,SAAS,EAAE,QAAQ;AACnB,gBAAA,aAAa,EAAE,YAAY;gBAC3B,UAAU,EAAE,SAAS,CAAC,iBAAiB;gBACvC,GAAG,KAAK,GAAG,EAAC,KAAK,EAAC,GAAG,EAAE;AACxB,aAAA;AACF,SAAA,CAAC,EAAE,EAAC,OAAO,EAAE,kBAAkB,EAAC,CAAC,CAAC,IAAI,CACrC,UAAU,CAAC,CAAC,GAAG,KAAI;AACjB,YAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;AACjB,YAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/B,SAAC,CAAC,EACF,GAAG,CAAC,MAAM,IAAG;YACX,IAAI,CAAC,KAAK,GAAG;AACX,gBAAA,GAAG,MAAM;gBACT,IAAI,EAAE,SAAS,CAAC,iBAAiB;aAClC,CAAC;SACH,CAAC,CACH,CAAC,CAAC;KACJ;AAES,IAAA,aAAa,CAAC,UAA8B,EAAA;AACpD,QAAA,MAAM,EAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAa,CAAC;AACjF,QAAA,MAAM,EAAC,QAAQ,EAAE,QAAQ,EAAC,GAAG,UAAU,CAAC;AACxC,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,UAAU,CAAC;AAC7D,YAAA,UAAU,EAAE;AACV,gBAAA,SAAS,EAAE,QAAQ;gBACnB,GAAG,YAAY,IAAI,EAAC,aAAa,EAAE,YAAY,EAAC,IAAI,EAAE;gBACtD,UAAU,EAAE,SAAS,CAAC,QAAQ;AAC9B,gBAAA,GAAG,KAAK,IAAI,EAAC,KAAK,EAAC,IAAI,EAAE;gBACzB,QAAQ;gBACR,QAAQ;AACT,aAAA;AACF,SAAA,CAAC,EAAE,EAAC,OAAO,EAAE,kBAAkB,EAAC,CAAC,CAAC,IAAI,CACrC,UAAU,CAAC,GAAG,IAAG;AACf,YAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;AACjB,YAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/B,SAAC,CAAC,EACF,GAAG,CAAC,MAAM,IAAG;YACX,IAAI,CAAC,KAAK,GAAG;AACX,gBAAA,GAAG,MAAM;gBACT,IAAI,EAAE,SAAS,CAAC,QAAQ;aACzB,CAAC;SACH,CAAC,CACH,CAAC,CAAC;KACJ;IAES,MAAM,kBAAkB,CAAC,UAAmC,EAAA;AACpE,QAAA,MAAM,EAAC,MAAM,EAAC,GAAG,IAAI,CAAC,UAAiB,CAAC;AACxC,QAAA,IAAI,gBAAgB,GAAG,CAAA,EAAG,MAAM,CAAC,aAAa,EAAE,CAAC;AACjD,QAAA,gBAAgB,IAAI,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AACrE,QAAA,gBAAgB,IAAI,CAAa,UAAA,EAAA,MAAM,CAAC,QAAQ,EAAE,CAAC;QACnD,gBAAgB,IAAI,iBAAiB,kBAAkB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA,CAAE,CAAC;AAClF,QAAA,gBAAgB,IAAI,CAAkB,eAAA,EAAA,UAAU,CAAC,YAAY,EAAE,CAAC;QAChE,gBAAgB,IAAI,CAAU,OAAA,EAAA,kBAAkB,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA,CAAE,CAAC;QACvE,gBAAgB,IAAI,CAAU,OAAA,EAAA,kBAAkB,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA,CAAE,CAAC;QAC3E,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAG,EAAA,gBAAgB,CAAG,EAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAG,EAAA,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAE,CAAA,CAAC,CAAC;KAC7H;IAES,MAAM,qBAAqB,CAAC,MAAW,EAAA;QAC/C,IAAI,MAAM,CAAC,IAAI,EAAE;AACf,YAAA,MAAM,YAAY,GAAG,YAAY,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,GAAG,EAAC,GAAG,IAAI,CAAC,KAAK,EAAE,YAAY,EAAC,CAAC;AAC3C,YAAA,OAAO,mBAAmB,MAAM,IAAI,CAAC,YAAY,CAAC,6BAA6B,CAAC;AACjF,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACX;AAES,IAAA,aAAa,CAAC,MAAW,EAAA;AACjC,QAAA,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE;AACjE,YAAA,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,EAAC,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAC,CAAC;YACpC,OAAO,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAC;AAC1B,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACX;IAEO,aAAa,CAAC,KAAkB,EAClB,UAAmC,EAAA;AACvD,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE;AACtC,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;QACD,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE;YACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;AACjD,YAAA,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC;AACvC,SAAA;QACD,OAAO,UAAU,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;KACzD;IAEO,4BAA4B,GAAA;AAClC,QAAA,MAAM,EAAC,MAAM,EAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC/B,QAAA,IAAI,YAAY,GAAG,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACvD,QAAA,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AACjH,QAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAG;AACzB,YAAA,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,OAAO,GAAG,aAAa,GAAG,OAAO,GAAG,aAAa,CAAC,CAAC;YAC/E,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC9C,SAAC,CAAC,CAAC;QACH,OAAO,YAAY,CAAC,MAAM,IAAI,IAAI,YAAY,CAAA,CAAE,IAAI,EAAE,CAAC;KACxD;IAEO,iBAAiB,GAAA;AACvB,QAAA,MAAM,EAAC,IAAI,EAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC7B,QAAA,IAAI,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9C,QAAA,MAAM,QAAQ,GAAG;YACf,cAAc;YACd,YAAY;YACZ,YAAY;YACZ,OAAO;YACP,OAAO;YACP,OAAO;YACP,mBAAmB;YACnB,eAAe;YACf,OAAO;YACP,UAAU;YACV,MAAM;SACP,CAAC;AACF,QAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAG;AACzB,YAAA,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,OAAO,GAAG,aAAa,GAAG,OAAO,GAAG,aAAa,CAAC,CAAC;YAC/E,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACpC,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC;KAC9B;AAEO,IAAA,SAAS,CAAC,UAAmC,EAAA;AACnD,QAAA,MAAM,EAAC,KAAK,EAAC,GAAG,UAAU,IAAI,EAAE,CAAC;QACjC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAClC;;AAhTU,YAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,kGAmHH,QAAQ,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;6GAnHjB,YAAY,EAAA,CAAA,CAAA;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,UAAU;uIAoHyC,QAAQ,EAAA,UAAA,EAAA,CAAA;0BAA7C,MAAM;2BAAC,QAAQ,CAAA;;;MCjKjB,gBAAgB,CAAA;IAE3B,WAAsB,CAAA,YAA+B,EAC/B,UAAuB,EAAA;QADvB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAmB;QAC/B,IAAU,CAAA,UAAA,GAAV,UAAU,CAAa;KAC5C;IAED,SAAS,CAAC,GAAqB,EAAE,IAAiB,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAClF,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,KAAK,IAAG;YACV,IAAI,KAAK,EAAE,YAAY,EAAE;AACvB,gBAAA,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;AACd,oBAAA,UAAU,EAAE;wBACV,aAAa,EAAE,GAAG,KAAK,CAAC,UAAU,CAAI,CAAA,EAAA,KAAK,CAAC,YAAY,CAAE,CAAA;AAC3D,qBAAA;AACF,iBAAA,CAAC,CAAC;AACJ,aAAA;AACD,YAAA,OAAO,GAAG,CAAC;SACZ,CAAC,EACF,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAClC,UAAU,CAAC,CAAC,GAAsB,KAAI;AACpC,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;AACtB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG;AACxB,oBAAA,KAAK,EAAE,CAAA,EAAG,GAAG,CAAC,MAAM,CAAE,CAAA;oBACtB,iBAAiB,EAAE,GAAG,CAAC,OAAO;iBAC/B,CAAC;AACH,aAAA;AACD,YAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;SAC9B,CAAC,CACH,CAAC;KACH;AAEO,IAAA,cAAc,CAAC,GAAqB,EAAA;QAC1C,MAAM,EAAC,WAAW,EAAC,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;AAC5C,QAAA,IAAI,WAAW,EAAE;AACf,YAAA,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;gBACpC,IAAI;oBACF,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;AAC7B,wBAAA,OAAO,IAAI,CAAC;AACb,qBAAA;AACF,iBAAA;AAAC,gBAAA,OAAO,GAAG,EAAE;AACb,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;;6GA7CU,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;iHAAhB,gBAAgB,EAAA,CAAA,CAAA;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;;;;MCeE,mBAAmB,CAAA;AAmF9B,IAAA,WAAA,CAAoB,YAA0B,EAC1B,eAA0B,EACR,QAAkB,EAAA;QAFpC,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAC1B,IAAe,CAAA,eAAA,GAAf,eAAe,CAAW;QACR,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAU;QAnFxD,iCAAgB,CAAA,GAAA,CAAA,IAAA,EAAA,IAAI,YAAY,EAAE,CAAC,CAAA;QACnC,gCAAsB,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;QACtB,iCAAuB,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;QACvB,yBAAwB,CAAA,GAAA,CAAA,IAAA,EAAA;AACtB,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,aAAa,EAAE,SAAS;AACxB,YAAA,UAAU,EAAE,SAAS;AACrB,YAAA,MAAM,EAAE,2BAA2B;SACpC,CAAC,CAAA;AAOF,QAAA,IAAA,CAAA,IAAI,GAAc,SAAS,CAAC,QAAQ,CAAC;QAiCrC,IAAY,CAAA,YAAA,GAAG,KAAK,CAAC;QAErB,IAAK,CAAA,KAAA,GAAG,EAAE,CAAC;QAEX,IAAW,CAAA,WAAA,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAKtD,IAAQ,CAAA,QAAA,GAAG,EAAE,CAAC;QACd,IAAQ,CAAA,QAAA,GAAG,EAAE,CAAC;QAEd,IAAW,CAAA,WAAA,GAAG,WAAW,CAAC;QAC1B,IAAS,CAAA,SAAA,GAAG,SAAS,CAAC;QACtB,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAC;AACjB,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CACtC,GAAG,CAAC,CAAC,IAAG;YACN,IAAI,CAAC,KAAK,WAAW,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;AACrD,gBAAA,sBAAA,CAAA,IAAI,EAAA,iCAAA,EAAA,GAAA,CAAc,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAC3C,IAAI,CAAC,CAAC,CAAC,CACR,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;AACzC,aAAA;AAAM,iBAAA;AACL,gBAAA,MAAM,EAAC,KAAK,EAAC,GAAG,IAAI,CAAC,YAAY,CAAC;AAClC,gBAAA,MAAM,QAAQ,GAAG,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjG,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;AAC/F,aAAA;SACF,CAAC,CACH,CAAC;AACF,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,CAAkB,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtD,IAAc,CAAA,cAAA,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;KAKpC;AAxED,IAAA,IAAI,IAAI,GAAA;QACN,OAAO,sBAAA,CAAA,IAAI,EAAA,yBAAA,EAAA,GAAA,CAAM,CAAC;KACnB;IAKD,IACI,IAAI,CAAC,IAAI,EAAA;AACX,QAAA,sBAAA,CAAA,IAAI,EAAS,yBAAA,EAAA;YACX,GAAG,sBAAA,CAAA,IAAI,EAAM,yBAAA,EAAA,GAAA,CAAA;AACb,YAAA,GAAG,IAAI;AACR,SAAA,EAAA,GAAA,CAAA,CAAC;KACH;AAED,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,sBAAA,CAAA,IAAI,EAAa,gCAAA,EAAA,GAAA,CAAA,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAA,CAAE,CAAC;KAChG;IAED,IACI,WAAW,CAAC,WAAmB,EAAA;AACjC,QAAA,IAAI,WAAW,EAAE;AACf,YAAA,sBAAA,CAAA,IAAI,EAAA,gCAAA,EAAgB,WAAW,EAAA,GAAA,CAAA,CAAC;AACjC,SAAA;KACF;IAED,IACI,YAAY,CAAC,YAAoB,EAAA;QACnC,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,sBAAA,CAAA,IAAI,EAAA,iCAAA,EAAiB,YAAY,EAAA,GAAA,CAAA,CAAC;AACnC,SAAA;KACF;AAED,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,uBAAA,IAAI,EAAA,iCAAA,EAAA,GAAA,CAAc,IAAI,IAAI,CAAC,IAAI,CAAC;KACxC;IAuCD,WAAW,GAAA;AACT,QAAA,sBAAA,CAAA,IAAI,EAAA,iCAAA,EAAA,GAAA,CAAc,CAAC,WAAW,EAAE,CAAC;KAClC;IAED,MAAM,GAAA;QACJ,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;KAC7C;AAED,IAAA,KAAK,CAAC,UAA2B,EAAA;AAC/B,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;KAC5C;IAED,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;KAChC;IAGD,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;KACvB;;;AA5GU,mBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,mEAqFV,QAAQ,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AArFjB,mBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,mbCtBhC,kgGAoEA,EAAA,MAAA,EAAA,CAAA,shBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;2FD9Ca,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;+BACE,aAAa,EAAA,aAAA,EAGR,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,kgGAAA,EAAA,MAAA,EAAA,CAAA,shBAAA,CAAA,EAAA,CAAA;yGAuFW,QAAQ,EAAA,UAAA,EAAA,CAAA;0BAA3C,MAAM;2BAAC,QAAQ,CAAA;4CAlE5B,IAAI,EAAA,CAAA;sBADH,KAAK;gBAIF,IAAI,EAAA,CAAA;sBADP,KAAK;gBAaF,WAAW,EAAA,CAAA;sBADd,KAAK;gBAQF,YAAY,EAAA,CAAA;sBADf,KAAK;gBAYN,YAAY,EAAA,CAAA;sBADX,KAAK;gBAGN,KAAK,EAAA,CAAA;sBADJ,KAAK;gBAGN,WAAW,EAAA,CAAA;sBADV,MAAM;gBAGP,YAAY,EAAA,CAAA;sBADX,KAAK;gBAGN,aAAa,EAAA,CAAA;sBADZ,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,OAAO,EAAE,EAAC,MAAM,EAAE,KAAK,EAAC,CAAA;gBA+CtC,aAAa,EAAA,CAAA;sBADZ,YAAY;uBAAC,uBAAuB,CAAA;;;AEpHvC,MAAM,YAAY,GAAG,CAAC,UAAkB,EAAE,UAAkB,KAAc;IACxE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,IAAI,UAAU,GAAG,CAAG,EAAA,UAAU,GAAG,UAAU,CAAA,CAAE,GAAG,kBAAkB,CAAC,CAAC;IAClG,MAAM,EAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAC,GAAG,GAAG,CAAC;IACnF,OAAO;AACL,QAAA,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI;QACpE,MAAM,GAAA;SACL;AACD,QAAA,MAAM,CAAC,CAAS,EAAA;SACf;AACD,QAAA,eAAe,EAAE,EAAS;AAC1B,QAAA,OAAO,CAAC,CAAS,EAAA;SAChB;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG;AACtB,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,UAAU,CAAC,UAAkB,EAAE,UAAkB,EAAE,UAAkB,EAAA;AACnE,QAAA,OAAO,iBAAiB,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;KACxF;AACD,IAAA,IAAI,EAAE;QACJ,WAAW;AACX,QAAA,CAAC,IAAI,QAAQ,EAAE,EAAE,WAAW,CAAC;AAC7B,QAAA,CAAC,IAAI,QAAQ,EAAE,EAAE,WAAW,CAAC;AAC9B,KAAA;CACF,CAAC;AAEF,MAAM,WAAW,GAAY;IAC3B,KAAK,GAAA;KACJ;AACD,IAAA,OAAO,CAAC,GAAW,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC;KACb;AACD,IAAA,GAAG,CAAC,KAAa,EAAA;AACf,QAAA,OAAO,IAAI,CAAC;KACb;AACD,IAAA,UAAU,CAAC,GAAW,EAAA;KACrB;IACD,OAAO,CAAC,GAAW,EAAE,KAAa,EAAA;KACjC;AACD,IAAA,MAAM,EAAE,CAAC;CACV,CAAC;AAEF,MAAM,cAAc,GAAG;AACrB,IAAA,OAAO,EAAE,OAAO;AAChB,IAAA,UAAU,CAAC,UAAkB,EAAA;AAC3B,QAAA,OAAO,iBAAiB,CAAC,UAAU,CAAC,GAAG,YAAY,GAAG,WAAW,CAAC;KACnE;IACD,IAAI,EAAE,CAAC,WAAW,CAAC;CACpB,CAAC;AAEF,MAAM,eAAe,GAAG;AACtB,IAAA,OAAO,EAAE,iBAAiB;AAC1B,IAAA,UAAU,CAAC,WAAwB,EAAA;;AAEjC,QAAA,OAAO,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;KACpC;IACD,IAAI,EAAE,CAAC,WAAW,CAAC;CACpB,CAAC;AAEF,MAAM,uBAAuB,GAAG;AAC9B,IAAA,OAAO,EAAE,iBAAiB;AAC1B,IAAA,QAAQ,EAAE,gBAAgB;AAC1B,IAAA,KAAK,EAAE,IAAI;CACZ,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAgB,KAAI;IACzC,OAAO;QACL,OAAO;AACP,QAAA,UAAU,EAAE,OAAO;AACnB,QAAA,WAAW,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC,CAAC;MAYW,WAAW,CAAA;AAEtB,IAAA,OAAO,OAAO,CAAC,MAAA,GAAsB,EAAE,EAAA;QACrC,OAAO;AACL,YAAA,QAAQ,EAAE,WAAW;AACrB,YAAA,SAAS,EAAE;gBACT,eAAe;gBACf,cAAc;gBACd,eAAe;AACf,gBAAA,yBAAyB,CAAC,CAAC,OAAgB,MAAM;oBAC/C,GAAG,aAAa,CAAC,OAAO,CAAC;AACzB,oBAAA,GAAG,MAAM;AACV,iBAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;gBACd,iBAAiB;gBACjB,uBAAuB;gBACvB,YAAY;AACb,aAAA;SACF,CAAC;KACH;;wGAlBU,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;yGAAX,WAAW,EAAA,YAAA,EAAA,CAHP,mBAAmB,CAAA,EAAA,OAAA,EAAA,CALhC,YAAY;QACZ,WAAW;QACX,gBAAgB;AAChB,QAAA,YAAY,aAGJ,mBAAmB,CAAA,EAAA,CAAA,CAAA;AAElB,WAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,YARpB,YAAY;QACZ,WAAW;QACX,gBAAgB;QAChB,YAAY,CAAA,EAAA,CAAA,CAAA;2FAKH,WAAW,EAAA,UAAA,EAAA,CAAA;kBAVvB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,WAAW;wBACX,gBAAgB;wBAChB,YAAY;AACb,qBAAA;oBACD,YAAY,EAAE,CAAC,mBAAmB,CAAC;oBACnC,OAAO,EAAE,CAAC,mBAAmB,CAAC;AAC/B,iBAAA,CAAA;;;AC9FD;;AAEG;;ACFH;;AAEG;;;;"}
package/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- export * from './lib/models';
2
- export * from './lib/services/oauth.service';
3
- export * from './lib/services/oauth.interceptor';
4
- export * from './lib/components/login/oauth-login.component';
5
- export * from './lib/oauth.module';
1
+ export * from './models';
2
+ export * from './services/token.service';
3
+ export * from './services/oauth.service';
4
+ export * from './services/oauth.interceptor';
5
+ export * from './components/login/oauth-login.component';
6
+ export * from './oauth.module';
File without changes
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-oauth",
3
- "version": "4.2.2",
3
+ "version": "4.2.3",
4
4
  "author": "Fl0r14n <florian.chis@gmail.com>",
5
5
  "homepage": "https://github.com/Fl0r14n/ngx-oauth",
6
6
  "description": "A fully OAuth2.1 compliant angular library",
@@ -1,11 +1,11 @@
1
1
  import { HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
2
2
  import { OAuthConfig } from '../models';
3
- import { TokenService } from './token.service';
3
+ import { OAuthTokenService } from './token.service';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class OAuthInterceptor implements HttpInterceptor {
6
- protected tokenService: TokenService;
6
+ protected tokenService: OAuthTokenService;
7
7
  protected authConfig: OAuthConfig;
8
- constructor(tokenService: TokenService, authConfig: OAuthConfig);
8
+ constructor(tokenService: OAuthTokenService, authConfig: OAuthConfig);
9
9
  intercept(req: HttpRequest<any>, next: HttpHandler): import("rxjs").Observable<import("@angular/common/http").HttpEvent<any>>;
10
10
  private isPathExcepted;
11
11
  static ɵfac: i0.ɵɵFactoryDeclaration<OAuthInterceptor, never>;
@@ -2,11 +2,11 @@ import { HttpClient } from '@angular/common/http';
2
2
  import { ReplaySubject } from 'rxjs';
3
3
  import { AuthorizationParameters, OAuthConfig, OAuthParameters, OAuthStatus, OAuthToken, OAuthType, OAuthTypeConfig, ResourceParameters, UserInfo } from '../models';
4
4
  import { Location as Location2 } from '@angular/common';
5
- import { TokenService } from './token.service';
5
+ import { OAuthTokenService } from './token.service';
6
6
  import * as i0 from "@angular/core";
7
7
  export declare class OAuthService {
8
8
  protected authConfig: OAuthConfig;
9
- protected tokenService: TokenService;
9
+ protected tokenService: OAuthTokenService;
10
10
  protected http: HttpClient;
11
11
  protected location: Location;
12
12
  protected locationService: Location2;
@@ -17,11 +17,13 @@ export declare class OAuthService {
17
17
  userInfo$: import("rxjs").Observable<UserInfo>;
18
18
  type$: import("rxjs").Observable<OAuthType | undefined>;
19
19
  ignorePaths: RegExp[];
20
+ get storageKey(): string | undefined;
21
+ set storageKey(storageKey: string | undefined);
20
22
  get token(): OAuthToken;
21
23
  set token(token: OAuthToken);
22
24
  get config(): OAuthTypeConfig | undefined;
23
25
  set config(config: OAuthTypeConfig | undefined);
24
- constructor(authConfig: OAuthConfig, tokenService: TokenService, http: HttpClient, location: Location, locationService: Location2);
26
+ constructor(authConfig: OAuthConfig, tokenService: OAuthTokenService, http: HttpClient, location: Location, locationService: Location2);
25
27
  login(parameters?: OAuthParameters): Promise<void>;
26
28
  logout(useLogoutUrl?: boolean): void;
27
29
  getUserInfo(path?: string): import("rxjs").Observable<UserInfo>;
@@ -3,7 +3,7 @@ import { Observable } from 'rxjs';
3
3
  import { OAuthConfig, OAuthToken } from '../models';
4
4
  import { HttpClient } from '@angular/common/http';
5
5
  import * as i0 from "@angular/core";
6
- export declare class TokenService {
6
+ export declare class OAuthTokenService {
7
7
  #private;
8
8
  protected authConfig: OAuthConfig;
9
9
  protected http: HttpClient;
@@ -17,6 +17,6 @@ export declare class TokenService {
17
17
  get saved(): OAuthToken;
18
18
  set saved(token: OAuthToken);
19
19
  protected refreshToken(token?: OAuthToken): Observable<OAuthToken>;
20
- static ɵfac: i0.ɵɵFactoryDeclaration<TokenService, never>;
21
- static ɵprov: i0.ɵɵInjectableDeclaration<TokenService>;
20
+ static ɵfac: i0.ɵɵFactoryDeclaration<OAuthTokenService, never>;
21
+ static ɵprov: i0.ɵɵInjectableDeclaration<OAuthTokenService>;
22
22
  }
@@ -1,47 +0,0 @@
1
- import { inject, Injectable, InjectionToken } from '@angular/core';
2
- import { HttpHeaders } from '@angular/common/http';
3
- import * as i0 from "@angular/core";
4
- export const SERVER_HOST = new InjectionToken('SERVER_HOST');
5
- export const SERVER_PATH = new InjectionToken('SERVER_PATH');
6
- export const LOCATION = new InjectionToken('Location');
7
- export const STORAGE = new InjectionToken('Storage');
8
- export const OAUTH_CONFIG = new InjectionToken('OAuthConfig');
9
- export const OAUTH_TOKEN = new InjectionToken('OAuthToken');
10
- export const HEADER_APPLICATION = new HttpHeaders({ 'Content-Type': 'application/x-www-form-urlencoded' });
11
- export const OAUTH_HTTP_CLIENT = new InjectionToken('OAuthHttpClient');
12
- export class OAuthConfig {
13
- }
14
- OAuthConfig.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
15
- OAuthConfig.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthConfig, providedIn: 'root', useFactory: () => inject(OAUTH_CONFIG).reduce((p, c) => ({ ...p, ...c }), {}) });
16
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthConfig, decorators: [{
17
- type: Injectable,
18
- args: [{
19
- providedIn: 'root',
20
- useFactory: () => inject(OAUTH_CONFIG).reduce((p, c) => ({ ...p, ...c }), {})
21
- }]
22
- }] });
23
- export const provideOAuthConfig = (config = {}) => ({
24
- provide: OAUTH_CONFIG,
25
- useValue: config,
26
- multi: true
27
- });
28
- export const provideOAuthConfigFactory = (factory, deps) => ({
29
- provide: OAUTH_CONFIG,
30
- useFactory: factory,
31
- deps: deps,
32
- multi: true
33
- });
34
- export var OAuthType;
35
- (function (OAuthType) {
36
- OAuthType["RESOURCE"] = "password";
37
- OAuthType["AUTHORIZATION_CODE"] = "code";
38
- OAuthType["IMPLICIT"] = "token";
39
- OAuthType["CLIENT_CREDENTIAL"] = "client_credentials";
40
- })(OAuthType || (OAuthType = {}));
41
- export var OAuthStatus;
42
- (function (OAuthStatus) {
43
- OAuthStatus["NOT_AUTHORIZED"] = "NOT_AUTHORIZED";
44
- OAuthStatus["AUTHORIZED"] = "AUTHORIZED";
45
- OAuthStatus["DENIED"] = "DENIED";
46
- })(OAuthStatus || (OAuthStatus = {}));
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtb2F1dGgvc3JjL2xpYi9tb2RlbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQixNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUFhLFdBQVcsRUFBQyxNQUFNLHNCQUFzQixDQUFDOztBQUU3RCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQVMsYUFBYSxDQUFDLENBQUM7QUFDckUsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFTLGFBQWEsQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxJQUFJLGNBQWMsQ0FBVyxVQUFVLENBQUMsQ0FBQztBQUNqRSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQVUsU0FBUyxDQUFDLENBQUM7QUFDOUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLElBQUksY0FBYyxDQUFnQixhQUFhLENBQUMsQ0FBQztBQUM3RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQWEsWUFBWSxDQUFDLENBQUM7QUFDeEUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBQyxjQUFjLEVBQUUsbUNBQW1DLEVBQUMsQ0FBQyxDQUFDO0FBQ3pHLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLElBQUksY0FBYyxDQUFhLGlCQUFpQixDQUFDLENBQUM7QUFNbkYsTUFBTSxPQUFnQixXQUFXOzt3R0FBWCxXQUFXOzRHQUFYLFdBQVcsY0FIbkIsTUFBTSxjQUNOLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQzsyRkFFdkQsV0FBVztrQkFKaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtvQkFDbEIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztpQkFDNUU7O0FBUUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxTQUFzQixFQUFFLEVBQWlCLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxPQUFpQixFQUFFLElBQVksRUFBbUIsRUFBRSxDQUFDLENBQUM7SUFDOUYsT0FBTyxFQUFFLFlBQVk7SUFDckIsVUFBVSxFQUFFLE9BQU87SUFDbkIsSUFBSSxFQUFFLElBQUk7SUFDVixLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBTixJQUFZLFNBS1g7QUFMRCxXQUFZLFNBQVM7SUFDbkIsa0NBQXFCLENBQUE7SUFDckIsd0NBQTJCLENBQUE7SUFDM0IsK0JBQWtCLENBQUE7SUFDbEIscURBQXdDLENBQUE7QUFDMUMsQ0FBQyxFQUxXLFNBQVMsS0FBVCxTQUFTLFFBS3BCO0FBNEVELE1BQU0sQ0FBTixJQUFZLFdBSVg7QUFKRCxXQUFZLFdBQVc7SUFDckIsZ0RBQWlDLENBQUE7SUFDakMsd0NBQXlCLENBQUE7SUFDekIsZ0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUpXLFdBQVcsS0FBWCxXQUFXLFFBSXRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtGYWN0b3J5UHJvdmlkZXIsIGluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIFZhbHVlUHJvdmlkZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwSGVhZGVyc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5leHBvcnQgY29uc3QgU0VSVkVSX0hPU1QgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignU0VSVkVSX0hPU1QnKTtcbmV4cG9ydCBjb25zdCBTRVJWRVJfUEFUSCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdTRVJWRVJfUEFUSCcpO1xuZXhwb3J0IGNvbnN0IExPQ0FUSU9OID0gbmV3IEluamVjdGlvblRva2VuPExvY2F0aW9uPignTG9jYXRpb24nKTtcbmV4cG9ydCBjb25zdCBTVE9SQUdFID0gbmV3IEluamVjdGlvblRva2VuPFN0b3JhZ2U+KCdTdG9yYWdlJyk7XG5leHBvcnQgY29uc3QgT0FVVEhfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPE9BdXRoQ29uZmlnW10+KCdPQXV0aENvbmZpZycpO1xuZXhwb3J0IGNvbnN0IE9BVVRIX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuPE9BdXRoVG9rZW4+KCdPQXV0aFRva2VuJyk7XG5leHBvcnQgY29uc3QgSEVBREVSX0FQUExJQ0FUSU9OID0gbmV3IEh0dHBIZWFkZXJzKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCd9KTtcbmV4cG9ydCBjb25zdCBPQVVUSF9IVFRQX0NMSUVOVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxIdHRwQ2xpZW50PignT0F1dGhIdHRwQ2xpZW50Jyk7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICB1c2VGYWN0b3J5OiAoKSA9PiBpbmplY3QoT0FVVEhfQ09ORklHKS5yZWR1Y2UoKHAsIGMpID0+ICh7Li4ucCwgLi4uY30pLCB7fSlcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgT0F1dGhDb25maWcge1xuICBjb25maWc/OiBPQXV0aFR5cGVDb25maWc7XG4gIHN0b3JhZ2VLZXk/OiBzdHJpbmc7XG4gIHN0b3JhZ2U/OiBTdG9yYWdlO1xuICBpZ25vcmVQYXRocz86IFJlZ0V4cFtdO1xufVxuXG5leHBvcnQgY29uc3QgcHJvdmlkZU9BdXRoQ29uZmlnID0gKGNvbmZpZzogT0F1dGhDb25maWcgPSB7fSk6IFZhbHVlUHJvdmlkZXIgPT4gKHtcbiAgcHJvdmlkZTogT0FVVEhfQ09ORklHLFxuICB1c2VWYWx1ZTogY29uZmlnLFxuICBtdWx0aTogdHJ1ZVxufSk7XG5cbmV4cG9ydCBjb25zdCBwcm92aWRlT0F1dGhDb25maWdGYWN0b3J5ID0gKGZhY3Rvcnk6IEZ1bmN0aW9uLCBkZXBzPzogYW55W10pOiBGYWN0b3J5UHJvdmlkZXIgPT4gKHtcbiAgcHJvdmlkZTogT0FVVEhfQ09ORklHLFxuICB1c2VGYWN0b3J5OiBmYWN0b3J5LFxuICBkZXBzOiBkZXBzLFxuICBtdWx0aTogdHJ1ZVxufSk7XG5cbmV4cG9ydCBlbnVtIE9BdXRoVHlwZSB7XG4gIFJFU09VUkNFID0gJ3Bhc3N3b3JkJyxcbiAgQVVUSE9SSVpBVElPTl9DT0RFID0gJ2NvZGUnLFxuICBJTVBMSUNJVCA9ICd0b2tlbicsXG4gIENMSUVOVF9DUkVERU5USUFMID0gJ2NsaWVudF9jcmVkZW50aWFscydcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRDcmVkZW50aWFsQ29uZmlnIHtcbiAgdG9rZW5QYXRoOiBzdHJpbmc7XG4gIHJldm9rZVBhdGg/OiBzdHJpbmc7XG4gIGNsaWVudElkOiBzdHJpbmc7XG4gIGNsaWVudFNlY3JldD86IHN0cmluZztcbiAgc2NvcGU/OiBzdHJpbmc7XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1lbXB0eS1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VDb25maWcgZXh0ZW5kcyBDbGllbnRDcmVkZW50aWFsQ29uZmlnIHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbXBsaWNpdENvbmZpZyB7XG4gIGF1dGhvcml6ZVBhdGg6IHN0cmluZztcbiAgcmV2b2tlUGF0aD86IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgc2NvcGU/OiBzdHJpbmc7XG4gIGxvZ291dFBhdGg/OiBzdHJpbmc7XG4gIGxvZ291dFJlZGlyZWN0VXJpPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcml6YXRpb25Db2RlQ29uZmlnIGV4dGVuZHMgUmVzb3VyY2VDb25maWcge1xuICBhdXRob3JpemVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aG9yaXphdGlvbkNvZGVQS0NFQ29uZmlnIGV4dGVuZHMgQXV0aG9yaXphdGlvbkNvZGVDb25maWcge1xuICBwa2NlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5JZENvbmZpZyB7XG4gIGlzc3VlclBhdGg6IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgY2xpZW50U2VjcmV0Pzogc3RyaW5nO1xuICBzY29wZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVBhcmFtZXRlcnMge1xuICB1c2VybmFtZTogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcml6YXRpb25QYXJhbWV0ZXJzIHtcbiAgcmVkaXJlY3RVcmk6IHN0cmluZztcbiAgcmVzcG9uc2VUeXBlOiBPQXV0aFR5cGUuSU1QTElDSVQgfCBPQXV0aFR5cGUuQVVUSE9SSVpBVElPTl9DT0RFIHwgc3RyaW5nO1xuICBzdGF0ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgT0F1dGhQYXJhbWV0ZXJzID0gUmVzb3VyY2VQYXJhbWV0ZXJzIHwgQXV0aG9yaXphdGlvblBhcmFtZXRlcnM7XG5leHBvcnQgdHlwZSBPQXV0aFR5cGVDb25maWcgPSBPcGVuSWRDb25maWdcbiAgfCBBdXRob3JpemF0aW9uQ29kZVBLQ0VDb25maWdcbiAgfCBBdXRob3JpemF0aW9uQ29kZUNvbmZpZ1xuICB8IEltcGxpY2l0Q29uZmlnXG4gIHwgUmVzb3VyY2VDb25maWdcbiAgfCBDbGllbnRDcmVkZW50aWFsQ29uZmlnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9BdXRoVG9rZW4ge1xuICBpZF90b2tlbj86IHN0cmluZztcbiAgYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xuICByZWZyZXNoX3Rva2VuPzogc3RyaW5nO1xuICB0b2tlbl90eXBlPzogc3RyaW5nO1xuICBzdGF0ZT86IHN0cmluZztcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIGVycm9yX2Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBleHBpcmVzX2luPzogbnVtYmVyIHwgc3RyaW5nO1xuICByZWZyZXNoX2V4cGlyZXNfaW4/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHNjb3BlPzogc3RyaW5nO1xuICBjb2RlVmVyaWZpZXI/OiBzdHJpbmc7XG4gIG5vbmNlPzogc3RyaW5nO1xuICB0eXBlPzogT0F1dGhUeXBlO1xuICBleHBpcmVzPzogbnVtYmVyO1xuICBcbiAgW3g6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGVudW0gT0F1dGhTdGF0dXMge1xuICBOT1RfQVVUSE9SSVpFRCA9ICdOT1RfQVVUSE9SSVpFRCcsXG4gIEFVVEhPUklaRUQgPSAnQVVUSE9SSVpFRCcsXG4gIERFTklFRCA9ICdERU5JRUQnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbklkQ29uZmlndXJhdGlvbiB7XG4gIGlzc3Vlcj86IHN0cmluZztcbiAgYXV0aG9yaXphdGlvbl9lbmRwb2ludD86IHN0cmluZztcbiAgaW50cm9zcGVjdGlvbl9lbmRwb2ludD86IHN0cmluZztcbiAgdG9rZW5fZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIHVzZXJpbmZvX2VuZHBvaW50Pzogc3RyaW5nO1xuICBlbmRfc2Vzc2lvbl9lbmRwb2ludD86IHN0cmluZztcbiAgcmV2b2NhdGlvbl9lbmRwb2ludD86IHN0cmluZztcbiAgc2NvcGVzX3N1cHBvcnRlZD86IHN0cmluZ1tdO1xuICBjb2RlX2NoYWxsZW5nZV9tZXRob2RzX3N1cHBvcnRlZD86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJbmZvIHtcbiAgZW1haWw/OiBzdHJpbmc7XG4gIGVtYWlsX3ZlcmlmaWVkPzogYm9vbGVhbjtcbiAgZmFtaWx5X25hbWU/OiBzdHJpbmc7XG4gIGdpdmVuX25hbWU/OiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHByZWZlcnJlZF91c2VybmFtZT86IHN0cmluZztcbiAgc3ViPzogc3RyaW5nO1xuICBhZGRyZXNzPzogb2JqZWN0O1xuICBwaWN0dXJlPzogc3RyaW5nO1xuICBsb2NhbGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50cm9zcGVjdEluZm8gZXh0ZW5kcyBVc2VySW5mbyB7XG4gIGFjdGl2ZTogYm9vbGVhbjtcbiAgc2NvcGU6IHN0cmluZztcbiAgY2xpZW50X2lkPzogc3RyaW5nO1xuICB1c2VybmFtZTogc3RyaW5nO1xuICBleHA6IG51bWJlcjtcbn1cbiJdfQ==
@@ -1,120 +0,0 @@
1
- import { NgModule, Optional, PLATFORM_ID } from '@angular/core';
2
- import { FormsModule } from '@angular/forms';
3
- import { HTTP_INTERCEPTORS, HttpBackend, HttpClient, HttpClientModule } from '@angular/common/http';
4
- import { RouterModule } from '@angular/router';
5
- import { LOCATION, OAUTH_HTTP_CLIENT, provideOAuthConfigFactory, SERVER_HOST, SERVER_PATH, STORAGE } from './models';
6
- import { OAuthService } from './services/oauth.service';
7
- import { OAuthLoginComponent } from './components/login/oauth-login.component';
8
- import { CommonModule, isPlatformBrowser } from '@angular/common';
9
- import { OAuthInterceptor } from './services/oauth.interceptor';
10
- import { TokenService } from './services/token.service';
11
- import * as i0 from "@angular/core";
12
- const mockLocation = (serverHost, serverPath) => {
13
- const url = new URL(serverHost && serverPath ? `${serverHost}${serverPath}` : 'http://localhost');
14
- const { href, origin, protocol, host, hostname, port, pathname, search, hash } = url;
15
- return {
16
- href, origin, protocol, host, hostname, port, pathname, search, hash,
17
- reload() {
18
- },
19
- assign(_) {
20
- },
21
- ancestorOrigins: {},
22
- replace(_) {
23
- }
24
- };
25
- };
26
- const LocationService = {
27
- provide: LOCATION,
28
- useFactory(platformId, serverHost, serverPath) {
29
- return isPlatformBrowser(platformId) ? location : mockLocation(serverHost, serverPath);
30
- },
31
- deps: [
32
- PLATFORM_ID,
33
- [new Optional(), SERVER_HOST],
34
- [new Optional(), SERVER_PATH]
35
- ]
36
- };
37
- const mockStorage = {
38
- clear() {
39
- },
40
- getItem(key) {
41
- return null;
42
- },
43
- key(index) {
44
- return null;
45
- },
46
- removeItem(key) {
47
- },
48
- setItem(key, value) {
49
- },
50
- length: 0
51
- };
52
- const StorageService = {
53
- provide: STORAGE,
54
- useFactory(platformId) {
55
- return isPlatformBrowser(platformId) ? localStorage : mockStorage;
56
- },
57
- deps: [PLATFORM_ID]
58
- };
59
- const OAuthHttpClient = {
60
- provide: OAUTH_HTTP_CLIENT,
61
- useFactory(httpBackend) {
62
- // avoid http interceptors
63
- return new HttpClient(httpBackend);
64
- },
65
- deps: [HttpBackend]
66
- };
67
- const OAuthInterceptorService = {
68
- provide: HTTP_INTERCEPTORS,
69
- useClass: OAuthInterceptor,
70
- multi: true,
71
- };
72
- const defaultConfig = (storage) => {
73
- return {
74
- storage,
75
- storageKey: 'token',
76
- ignorePaths: []
77
- };
78
- };
79
- export class OAuthModule {
80
- static forRoot(config = {}) {
81
- return {
82
- ngModule: OAuthModule,
83
- providers: [
84
- LocationService,
85
- StorageService,
86
- OAuthHttpClient,
87
- provideOAuthConfigFactory((storage) => ({
88
- ...defaultConfig(storage),
89
- ...config
90
- }), [STORAGE]),
91
- TokenService,
92
- OAuthInterceptorService,
93
- OAuthService,
94
- ]
95
- };
96
- }
97
- }
98
- OAuthModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
99
- OAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.1.3", ngImport: i0, type: OAuthModule, declarations: [OAuthLoginComponent], imports: [CommonModule,
100
- FormsModule,
101
- HttpClientModule,
102
- RouterModule], exports: [OAuthLoginComponent] });
103
- OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthModule, imports: [CommonModule,
104
- FormsModule,
105
- HttpClientModule,
106
- RouterModule] });
107
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthModule, decorators: [{
108
- type: NgModule,
109
- args: [{
110
- imports: [
111
- CommonModule,
112
- FormsModule,
113
- HttpClientModule,
114
- RouterModule,
115
- ],
116
- declarations: [OAuthLoginComponent],
117
- exports: [OAuthLoginComponent]
118
- }]
119
- }] });
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW9hdXRoL3NyYy9saWIvb2F1dGgubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0IsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEcsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQWUseUJBQXlCLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDaEksT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7O0FBRXRELE1BQU0sWUFBWSxHQUFHLENBQUMsVUFBa0IsRUFBRSxVQUFrQixFQUFZLEVBQUU7SUFDeEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbEcsTUFBTSxFQUFDLElBQUksRUFBRSxN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QUM7SUFDSixDQUFDOzt3R0FsQlUsV0FBVzt5R0FBWCxXQUFXLGlCQUhQLG1CQUFtQixhQUxoQyxZQUFZO1FBQ1osV0FBVztRQUNYLGdCQUFnQjtRQUNoQixZQUFZLGFBR0osbUJBQW1CO3lHQUVsQixXQUFXLFlBUnBCLFlBQVk7UUFDWixXQUFXO1FBQ1gsZ0JBQWdCO1FBQ2hCLFlBQVk7MkZBS0gsV0FBVztrQkFWdkIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGdCQUFnQjt3QkFDaEIsWUFBWTtxQkFDYjtvQkFDRCxZQUFZLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDbkMsT0FBTyxFQUFFLENBQUMsbUJBQW1CLENBQUM7aUJBQy9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSwgT3B0aW9uYWwsIFBMQVRGT1JNX0lEfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7SFRUUF9JTlRFUkNFUFRPUlMsIEh0dHBCYWNrZW5kLCBIdHRwQ2xpZW50LCBIdHRwQ2xpZW50TW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1JvdXRlck1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7TE9DQVRJT04sIE9BVVRIX0hUVFBfQ0xJRU5ULCBPQXV0aENvbmZpZywgcHJvdmlkZU9BdXRoQ29uZmlnRmFjdG9yeSwgU0VSVkVSX0hPU1QsIFNFUlZFUl9QQVRILCBTVE9SQUdFfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQge09BdXRoU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcy9vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7T0F1dGhMb2dpbkNvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnRzL2xvZ2luL29hdXRoLWxvZ2luLmNvbXBvbmVudCc7XG5pbXBvcnQge0NvbW1vbk1vZHVsZSwgaXNQbGF0Zm9ybUJyb3dzZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge09BdXRoSW50ZXJjZXB0b3J9IGZyb20gJy4vc2VydmljZXMvb2F1dGguaW50ZXJjZXB0b3InO1xuaW1wb3J0IHtUb2tlblNlcnZpY2V9IGZyb20gJy4vc2VydmljZXMvdG9rZW4uc2VydmljZSc7XG5cbmNvbnN0IG1vY2tMb2NhdGlvbiA9IChzZXJ2ZXJIb3N0OiBzdHJpbmcsIHNlcnZlclBhdGg6IHN0cmluZyk6IExvY2F0aW9uID0+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChzZXJ2ZXJIb3N0ICYmIHNlcnZlclBhdGggPyBgJHtzZXJ2ZXJIb3N0fSR7c2VydmVyUGF0aH1gIDogJ2h0dHA6Ly9sb2NhbGhvc3QnKTtcbiAgY29uc3Qge2hyZWYsIG9yaWdpbiwgcHJvdG9jb2wsIGhvc3QsIGhvc3RuYW1lLCBwb3J0LCBwYXRobmFtZSwgc2VhcmNoLCBoYXNofSA9IHVybDtcbiAgcmV0dXJuIHtcbiAgICBocmVmLCBvcmlnaW4sIHByb3RvY29sLCBob3N0LCBob3N0bmFtZSwgcG9ydCwgcGF0aG5hbWUsIHNlYXJjaCwgaGFzaCxcbiAgICByZWxvYWQoKSB7XG4gICAgfSxcbiAgICBhc3NpZ24oXzogc3RyaW5nKSB7XG4gICAgfSxcbiAgICBhbmNlc3Rvck9yaWdpbnM6IHt9IGFzIGFueSxcbiAgICByZXBsYWNlKF86IHN0cmluZykge1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IExvY2F0aW9uU2VydmljZSA9IHtcbiAgcHJvdmlkZTogTE9DQVRJT04sXG4gIHVzZUZhY3RvcnkocGxhdGZvcm1JZDogT2JqZWN0LCBzZXJ2ZXJIb3N0OiBzdHJpbmcsIHNlcnZlclBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSA/IGxvY2F0aW9uIDogbW9ja0xvY2F0aW9uKHNlcnZlckhvc3QsIHNlcnZlclBhdGgpO1xuICB9LFxuICBkZXBzOiBbXG4gICAgUExBVEZPUk1fSUQsXG4gICAgW25ldyBPcHRpb25hbCgpLCBTRVJWRVJfSE9TVF0sXG4gICAgW25ldyBPcHRpb25hbCgpLCBTRVJWRVJfUEFUSF1cbiAgXVxufTtcblxuY29uc3QgbW9ja1N0b3JhZ2U6IFN0b3JhZ2UgPSB7XG4gIGNsZWFyKCkge1xuICB9LFxuICBnZXRJdGVtKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIGtleShpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpIHtcbiAgfSxcbiAgc2V0SXRlbShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICB9LFxuICBsZW5ndGg6IDBcbn07XG5cbmNvbnN0IFN0b3JhZ2VTZXJ2aWNlID0ge1xuICBwcm92aWRlOiBTVE9SQUdFLFxuICB1c2VGYWN0b3J5KHBsYXRmb3JtSWQ6IE9iamVjdCkge1xuICAgIHJldHVybiBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSA/IGxvY2FsU3RvcmFnZSA6IG1vY2tTdG9yYWdlO1xuICB9LFxuICBkZXBzOiBbUExBVEZPUk1fSURdXG59O1xuXG5jb25zdCBPQXV0aEh0dHBDbGllbnQgPSB7XG4gIHByb3ZpZGU6IE9BVVRIX0hUVFBfQ0xJRU5ULFxuICB1c2VGYWN0b3J5KGh0dHBCYWNrZW5kOiBIdHRwQmFja2VuZCkge1xuICAgIC8vIGF2b2lkIGh0dHAgaW50ZXJjZXB0b3JzXG4gICAgcmV0dXJuIG5ldyBIdHRwQ2xpZW50KGh0dHBCYWNrZW5kKTtcbiAgfSxcbiAgZGVwczogW0h0dHBCYWNrZW5kXVxufTtcblxuY29uc3QgT0F1dGhJbnRlcmNlcHRvclNlcnZpY2UgPSB7XG4gIHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLFxuICB1c2VDbGFzczogT0F1dGhJbnRlcmNlcHRvcixcbiAgbXVsdGk6IHRydWUsXG59O1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0gKHN0b3JhZ2U6IFN0b3JhZ2UpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBzdG9yYWdlLFxuICAgIHN0b3JhZ2VLZXk6ICd0b2tlbicsXG4gICAgaWdub3JlUGF0aHM6IFtdXG4gIH07XG59O1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEh0dHBDbGllbnRNb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlLFxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtPQXV0aExvZ2luQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW09BdXRoTG9naW5Db21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIE9BdXRoTW9kdWxlIHtcblxuICBzdGF0aWMgZm9yUm9vdChjb25maWc6IE9BdXRoQ29uZmlnID0ge30pOiBNb2R1bGVXaXRoUHJvdmlkZXJzPE9BdXRoTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBPQXV0aE1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBMb2NhdGlvblNlcnZpY2UsXG4gICAgICAgIFN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICBPQXV0aEh0dHBDbGllbnQsXG4gICAgICAgIHByb3ZpZGVPQXV0aENvbmZpZ0ZhY3RvcnkoKHN0b3JhZ2U6IFN0b3JhZ2UpID0+ICh7XG4gICAgICAgICAgLi4uZGVmYXVsdENvbmZpZyhzdG9yYWdlKSxcbiAgICAgICAgICAuLi5jb25maWdcbiAgICAgICAgfSksIFtTVE9SQUdFXSksXG4gICAgICAgIFRva2VuU2VydmljZSxcbiAgICAgICAgT0F1dGhJbnRlcmNlcHRvclNlcnZpY2UsXG4gICAgICAgIE9BdXRoU2VydmljZSxcbiAgICAgIF1cbiAgICB9O1xuICB9XG59XG4iXX0=