{"version":3,"file":"auth.mjs","sources":["../../../../packages/auth/src/auth.config.ts","../../../../packages/auth/src/store/local-storage.service.ts","../../../../packages/auth/src/store/interface.ts","../../../../packages/auth/src/token/token.service.ts","../../../../packages/auth/src/token/interface.ts","../../../../packages/auth/src/social/social.service.ts","../../../../packages/auth/src/store/memory.service.ts","../../../../packages/auth/src/store/session-storage.service.ts","../../../../packages/auth/src/store/cookie-storage.service.ts","../../../../packages/auth/src/token/helper.ts","../../../../packages/auth/src/token/jwt/jwt.helper.ts","../../../../packages/auth/src/token/jwt/jwt.model.ts","../../../../packages/auth/src/token/jwt/jwt.guard.ts","../../../../packages/auth/src/token.ts","../../../../packages/auth/src/token/base.interceptor.ts","../../../../packages/auth/src/token/jwt/jwt.interceptor.ts","../../../../packages/auth/src/token/simple/simple.guard.ts","../../../../packages/auth/src/token/simple/simple.interceptor.ts","../../../../packages/auth/src/token/simple/simple.model.ts","../../../../packages/auth/src/provide.ts","../../../../packages/auth/auth.ts"],"sourcesContent":["import type { AlainAuthConfig, AlainConfigService } from '@delon/util/config';\n\nexport const AUTH_DEFAULT_CONFIG: AlainAuthConfig = {\n  store_key: `_token`,\n  token_invalid_redirect: true,\n  token_exp_offset: 10,\n  token_send_key: `token`,\n  token_send_template: '${token}',\n  token_send_place: 'header',\n  login_url: '/login',\n  refreshTime: 3000,\n  refreshOffset: 6000,\n  ignores: [/\\/assets\\//]\n};\n\nexport function mergeConfig(srv: AlainConfigService): AlainAuthConfig {\n  return srv.merge('auth', AUTH_DEFAULT_CONFIG)!;\n}\n","import { IStore } from './interface';\nimport { ITokenModel } from '../token/interface';\n\nexport function DA_STORE_TOKEN_LOCAL_FACTORY(): IStore {\n  return new LocalStorageStore();\n}\n\n/**\n * `localStorage` storage, **not lost after closing the browser**.\n *\n * ```ts\n  provideHttpClient(withInterceptors([...(environment.interceptorFns ?? []), authJWTInterceptor, defaultInterceptor])),\n  provideAuth(withLocalStorage()),\n * ```\n */\nexport class LocalStorageStore implements IStore {\n  get(key: string): ITokenModel {\n    return JSON.parse(localStorage.getItem(key) ?? '{}') ?? {};\n  }\n\n  set(key: string, value: ITokenModel | null): boolean {\n    localStorage.setItem(key, JSON.stringify(value));\n    return true;\n  }\n\n  remove(key: string): void {\n    localStorage.removeItem(key);\n  }\n}\n","import { InjectionToken } from '@angular/core';\n\nimport { DA_STORE_TOKEN_LOCAL_FACTORY } from './local-storage.service';\nimport { ITokenModel } from '../token/interface';\n\nexport const DA_STORE_TOKEN = new InjectionToken<IStore>('AUTH_STORE_TOKEN', {\n  providedIn: 'root',\n  factory: DA_STORE_TOKEN_LOCAL_FACTORY\n});\n\nexport interface IStore {\n  get(key: string): ITokenModel;\n\n  set(key: string, value: ITokenModel): boolean;\n\n  remove(key: string): void;\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, interval, Observable, Subject, Subscription, filter, map, share } from 'rxjs';\n\nimport { AlainAuthConfig, AlainConfigService } from '@delon/util/config';\n\nimport { mergeConfig } from '../auth.config';\nimport { AuthReferrer, ITokenModel, ITokenService } from './interface';\nimport { DA_STORE_TOKEN } from '../store/interface';\n\nexport function DA_SERVICE_TOKEN_FACTORY(): ITokenService {\n  return new TokenService();\n}\n\n/**\n * 维护Token信息服务，[在线文档](https://ng-alain.com/auth)\n */\n@Injectable()\nexport class TokenService implements ITokenService, OnDestroy {\n  private readonly store = inject(DA_STORE_TOKEN);\n  private readonly cogSrv = inject(AlainConfigService);\n  private refresh$ = new Subject<ITokenModel>();\n  private change$ = new BehaviorSubject<ITokenModel | null>(null);\n  private interval$?: Subscription;\n  private _referrer: AuthReferrer = {};\n  private _options: AlainAuthConfig;\n\n  constructor() {\n    this._options = mergeConfig(this.cogSrv);\n  }\n\n  get refresh(): Observable<ITokenModel> {\n    this.builderRefresh();\n    return this.refresh$.pipe(share());\n  }\n\n  get login_url(): string | undefined {\n    return this._options.login_url;\n  }\n\n  get referrer(): AuthReferrer {\n    return this._referrer;\n  }\n\n  get options(): AlainAuthConfig {\n    return this._options;\n  }\n\n  set(data: ITokenModel): boolean {\n    const res = this.store.set(this._options.store_key!, data);\n    this.change$.next(data);\n    return res;\n  }\n\n  get(type?: any): any;\n  get<T extends ITokenModel>(type?: new () => T): T;\n  get<T extends ITokenModel>(type?: new () => T): T {\n    const data = this.store.get(this._options.store_key!);\n    return type ? (Object.assign(new type(), data) as T) : (data as T);\n  }\n\n  clear(options: { onlyToken: boolean } = { onlyToken: false }): void {\n    let data: ITokenModel | null = null;\n    if (options.onlyToken === true) {\n      data = this.get() as ITokenModel;\n      data.token = ``;\n      this.set(data);\n    } else {\n      this.store.remove(this._options.store_key!);\n    }\n    this.change$.next(data);\n  }\n\n  change(): Observable<ITokenModel | null> {\n    return this.change$.pipe(share());\n  }\n\n  private builderRefresh(): void {\n    const { refreshTime, refreshOffset } = this._options;\n    this.cleanRefresh();\n    this.interval$ = interval(refreshTime)\n      .pipe(\n        map(() => {\n          const item = this.get() as ITokenModel;\n          const expired = item.expired ?? item.exp ?? 0;\n          if (expired <= 0) {\n            return null;\n          }\n\n          const curTime = new Date().valueOf() + refreshOffset!;\n          return expired <= curTime ? item : null;\n        }),\n        filter(v => v != null)\n      )\n      .subscribe(res => this.refresh$.next(res!));\n  }\n\n  private cleanRefresh(): void {\n    if (this.interval$ && !this.interval$.closed) {\n      this.interval$.unsubscribe();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.cleanRefresh();\n  }\n}\n","import { InjectionToken } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { AlainAuthConfig } from '@delon/util/config';\n\nimport { DA_SERVICE_TOKEN_FACTORY } from './token.service';\n\nexport const DA_SERVICE_TOKEN = new InjectionToken<ITokenService>('DA_SERVICE_TOKEN', {\n  providedIn: 'root',\n  factory: DA_SERVICE_TOKEN_FACTORY\n});\n\nexport interface ITokenModel {\n  [key: string]: any;\n\n  token: string | null | undefined;\n\n  /**\n   * 过期时间，单位：ms\n   * - 不管Simple、JWT模式都必须指定\n   */\n  expired?: number;\n}\n\nexport interface AuthReferrer {\n  url?: string | null | undefined;\n}\n\nexport interface ITokenService {\n  /**\n   * 授权失败后跳转路由路径（支持外部链接地址），通过设置[全局配置](https://ng-alain.com/docs/global-config)来改变\n   */\n  readonly login_url: string | undefined;\n\n  /**\n   * 当前请求页面的来源页面的地址\n   */\n  readonly referrer?: AuthReferrer;\n\n  readonly options: AlainAuthConfig;\n\n  /**\n   * 订阅刷新，订阅时会自动产生一个定时器，每隔一段时间进行一些校验\n   * - **注意** 会多次触发，请务必做好业务判断\n   */\n  readonly refresh: Observable<ITokenModel>;\n\n  /**\n   * 设置 Token 信息，当用户 Token 发生变动时都需要调用此方法重新刷新\n   * - 如果需要监听过期，需要传递 `expired` 值\n   */\n  set(data: ITokenModel | null): boolean;\n\n  /**\n   * 获取Token，形式包括：\n   * - `get()` 获取 Simple Token\n   * - `get<JWTTokenModel>(JWTTokenModel)` 获取 JWT Token\n   */\n  get(type?: any): ITokenModel | null;\n\n  /**\n   * 获取Token，形式包括：\n   * - `get()` 获取 Simple Token\n   * - `get<JWTTokenModel>(JWTTokenModel)` 获取 JWT Token\n   */\n  get<T extends ITokenModel>(type?: any): T;\n\n  /**\n   * 清除 Token 信息，当用户退出登录时调用。\n   * ```\n   * // 清除所有 Token 信息\n   * tokenService.clear();\n   * // 只清除 token 字段\n   * tokenService.clear({ onlyToken: true });\n   * ```\n   */\n  clear(options?: { onlyToken: boolean }): void;\n\n  /**\n   * 订阅 Token 对象变更通知\n   */\n  change(): Observable<ITokenModel | null>;\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, OnDestroy, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, Observer } from 'rxjs';\n\nimport { DA_SERVICE_TOKEN, ITokenModel } from '../token/interface';\n\nconst OPENTYPE = '_delonAuthSocialType';\nconst HREFCALLBACK = '_delonAuthSocialCallbackByHref';\n\nexport type SocialOpenType = 'href' | 'window';\n\n@Injectable()\nexport class SocialService implements OnDestroy {\n  private readonly tokenService = inject(DA_SERVICE_TOKEN);\n  private readonly doc = inject(DOCUMENT);\n  private readonly router = inject(Router);\n\n  private _win: Window | null = null;\n  private _winTime: any;\n  private observer!: Observer<ITokenModel | null>;\n\n  /**\n   * 使用窗体打开授权页，返回值是 `Observable<ITokenModel>` 用于订阅授权后返回的结果\n   *\n   * @param url 获取授权地址\n   * @param callback 回调路由地址\n   * @param options.windowFeatures 等同 `window.open` 的 `features` 参数值\n   */\n  login(\n    url: string,\n    callback?: string,\n    options?: {\n      type?: 'window';\n      windowFeatures?: string;\n    }\n  ): Observable<ITokenModel>;\n\n  /**\n   * 跳转至授权页\n   *\n   * @param url 获取授权地址\n   * @param callback 回调路由地址\n   */\n  login(\n    url: string,\n    callback?: string,\n    options?: {\n      type?: 'href';\n    }\n  ): void;\n\n  /**\n   * 跳转至登录页，若为 `type=window` 时，返回值是 `Observable<ITokenModel>`\n   *\n   * @param url 获取授权地址\n   * @param callback 当 `type=href` 成功时的回调路由地址\n   * @param options.type 打开方式，默认 `window`\n   * @param options.windowFeatures 等同 `window.open` 的 `features` 参数值\n   */\n  login(\n    url: string,\n    callback: string = '/',\n    options: {\n      type?: SocialOpenType;\n      windowFeatures?: string;\n    } = {}\n  ): Observable<ITokenModel | null> | void {\n    options = {\n      type: 'window',\n      windowFeatures: 'location=yes,height=570,width=520,scrollbars=yes,status=yes',\n      ...options\n    };\n    localStorage.setItem(OPENTYPE, options.type!);\n    localStorage.setItem(HREFCALLBACK, callback);\n    if (options.type === 'href') {\n      this.doc.location.href = url;\n      return;\n    }\n\n    this._win = window.open(url, '_blank', options.windowFeatures);\n    this._winTime = setInterval(() => {\n      if (this._win && this._win.closed) {\n        this.ngOnDestroy();\n\n        let model = this.tokenService.get();\n        if (model && !model.token) model = null;\n\n        // 触发变更通知\n        if (model) {\n          this.tokenService.set(model);\n        }\n\n        this.observer.next(model);\n        this.observer.complete();\n      }\n    }, 100);\n    return new Observable((observer: Observer<ITokenModel | null>) => {\n      this.observer = observer;\n    });\n  }\n\n  /**\n   * 授权成功后的回调处理\n   *\n   * @param rawData 指定回调认证信息，为空时从根据当前URL解析\n   */\n  callback(rawData?: ITokenModel | string | null): ITokenModel {\n    // from uri\n    if (!rawData && this.router.url.indexOf('?') === -1) {\n      throw new Error(`url muse contain a ?`);\n    }\n    // parse\n    let data: ITokenModel = { token: `` };\n    if (typeof rawData === 'string') {\n      const rightUrl = rawData.split('?')[1].split('#')[0];\n      data = this.router.parseUrl(`./?${rightUrl}`).queryParams as ITokenModel;\n    } else {\n      data = rawData as ITokenModel;\n    }\n\n    if (!data || !data.token) throw new Error(`invalide token data`);\n    this.tokenService.set(data);\n\n    const url = localStorage.getItem(HREFCALLBACK) ?? '/';\n    localStorage.removeItem(HREFCALLBACK);\n    const type = localStorage.getItem(OPENTYPE);\n    localStorage.removeItem(OPENTYPE);\n    if (type === 'window') {\n      window.close();\n    } else {\n      this.router.navigateByUrl(url);\n    }\n\n    return data;\n  }\n\n  ngOnDestroy(): void {\n    clearInterval(this._winTime);\n    this._winTime = null;\n  }\n}\n","import { IStore } from './interface';\nimport { ITokenModel } from '../token/interface';\n\n/**\n * 内存存储，关掉浏览器标签后**丢失**。\n */\nexport class MemoryStore implements IStore {\n  private cache: Record<string, ITokenModel | null> = {};\n\n  get(key: string): ITokenModel {\n    return this.cache[key] ?? ({} as ITokenModel);\n  }\n\n  set(key: string, value: ITokenModel): boolean {\n    this.cache[key] = value;\n    return true;\n  }\n\n  remove(key: string): void {\n    this.cache[key] = null;\n  }\n}\n","import { IStore } from './interface';\nimport { ITokenModel } from '../token/interface';\n\n/**\n * `sessionStorage` storage, **lost after closing the browser**.\n *\n * ```ts\n  provideHttpClient(withInterceptors([...(environment.interceptorFns ?? []), authJWTInterceptor, defaultInterceptor])),\n  provideAuth(withSessionStorage()),\n * ```\n */\nexport class SessionStorageStore implements IStore {\n  get(key: string): ITokenModel {\n    return JSON.parse(sessionStorage.getItem(key) ?? '{}') ?? {};\n  }\n\n  set(key: string, value: ITokenModel | null): boolean {\n    sessionStorage.setItem(key, JSON.stringify(value));\n    return true;\n  }\n\n  remove(key: string): void {\n    sessionStorage.removeItem(key);\n  }\n}\n","import { inject } from '@angular/core';\n\nimport { CookieService } from '@delon/util/browser';\n\nimport { IStore } from './interface';\nimport { ITokenModel } from '../token/interface';\n\n/**\n * `cookie` storage\n *\n * ```ts\n  provideHttpClient(withInterceptors([...(environment.interceptorFns ?? []), authJWTInterceptor, defaultInterceptor])),\n  provideAuth(withCookie()),\n * ```\n */\nexport class CookieStorageStore implements IStore {\n  private readonly srv = inject(CookieService);\n\n  get(key: string): ITokenModel {\n    try {\n      return JSON.parse(this.srv.get(key) ?? '{}');\n    } catch (ex) {\n      if (typeof ngDevMode === 'undefined' || ngDevMode) {\n        console.error(`CookieStorageStore: Invalid key-value format ${key}`, ex);\n      }\n      return {} as ITokenModel;\n    }\n  }\n\n  set(key: string, value: ITokenModel | null | undefined): boolean {\n    const expires = (value?.expired ?? 0) / 1e3;\n    this.srv.put(key, JSON.stringify(value ?? {}), { expires });\n    return true;\n  }\n\n  remove(key: string): void {\n    this.srv.remove(key);\n  }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { AlainAuthConfig } from '@delon/util/config';\n\nimport { DA_SERVICE_TOKEN, ITokenService } from './interface';\nimport { JWTTokenModel } from './jwt/jwt.model';\nimport { SimpleTokenModel } from './simple/simple.model';\n\nexport function CheckSimple(model: SimpleTokenModel | null): boolean {\n  return model != null && typeof model.token === 'string' && model.token.length > 0;\n}\n\nexport function CheckJwt(model: JWTTokenModel, offset: number): boolean {\n  try {\n    return model != null && !!model.token && !model.isExpired(offset);\n  } catch (err: unknown) {\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      console.warn(`${(err as { message: string }).message}, jump to login_url`);\n    }\n    return false;\n  }\n}\n\nexport function ToLogin(options: AlainAuthConfig, url?: string): void {\n  const router = inject(Router);\n  const token = inject(DA_SERVICE_TOKEN) as ITokenService;\n  const doc = inject(DOCUMENT);\n  token.referrer!.url = url ?? router.url;\n  if (options.token_invalid_redirect === true) {\n    setTimeout(() => {\n      if (/^https?:\\/\\//g.test(options.login_url!)) {\n        doc.location.href = options.login_url as string;\n      } else {\n        router.navigate([options.login_url]);\n      }\n    });\n  }\n}\n","export function urlBase64Decode(str: string): string {\n  let output = str.replace(/-/g, '+').replace(/_/g, '/');\n  switch (output.length % 4) {\n    case 0: {\n      break;\n    }\n    case 2: {\n      output += '==';\n      break;\n    }\n    case 3: {\n      output += '=';\n      break;\n    }\n    default: {\n      throw new Error(`'atob' failed: The string to be decoded is not correctly encoded.`);\n    }\n  }\n  return b64DecodeUnicode(output);\n}\n\nfunction b64decode(str: string): string {\n  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n  let output = '';\n\n  str = String(str).replace(/=+$/, '');\n\n  for (\n    // initialize result and counters\n\n    let bc = 0, bs: any, buffer: any, idx = 0;\n    // get next character\n    (buffer = str.charAt(idx++));\n    // character found in table? initialize bit storage and add its ascii value;\n    ~buffer &&\n    ((bs = bc % 4 ? bs * 64 + buffer : buffer),\n    // and if not first of each 4 characters,\n    // convert the first 8 bits to one ascii character\n    bc++ % 4)\n      ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n      : 0\n  ) {\n    // try to find character in table (0-63, not found => -1)\n    buffer = chars.indexOf(buffer);\n  }\n  return output;\n}\n\n// https://developer.mozilla.org/en/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem\nfunction b64DecodeUnicode(str: string): string {\n  return decodeURIComponent(\n    Array.prototype.map\n      .call(b64decode(str), (c: string) => {\n        return `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`;\n      })\n      .join('')\n  );\n}\n","import { ITokenModel } from '../interface';\nimport { urlBase64Decode } from './jwt.helper';\n\nexport interface JWT {\n  /**\n   * Issuerd\n   */\n  iss: string;\n  /**\n   * Issued At\n   */\n  iat: string;\n  /**\n   * Subject\n   */\n  sub: string;\n  /**\n   * Expiration Time\n   */\n  exp: number;\n  /**\n   * Audience\n   */\n  aud: string;\n  /**\n   * Not Before\n   */\n  nbf: string;\n  /**\n   * JWT ID\n   */\n  jti: string;\n\n  [key: string]: any;\n  [key: number]: any;\n}\n\nexport class JWTTokenModel implements ITokenModel {\n  [key: string]: any;\n\n  token: string | null | undefined;\n\n  expired?: number;\n\n  /**\n   * 获取载荷信息\n   */\n  get payload(): JWT {\n    const parts = (this.token ?? '').split('.');\n    if (parts.length !== 3) throw new Error('JWT must have 3 parts');\n\n    const decoded = urlBase64Decode(parts[1]);\n    return JSON.parse(decoded);\n  }\n\n  /**\n   * 获取过期时间戳（单位：ms）\n   */\n  get exp(): number | null {\n    const decoded = this.payload;\n    if (!Object.prototype.hasOwnProperty.call(decoded, 'exp')) return null;\n    const date = new Date(0);\n    date.setUTCSeconds(decoded.exp);\n    return date.valueOf();\n  }\n\n  /**\n   * 检查Token是否过期，当`payload` 包含 `exp` 字段时有效，若无 `exp` 字段直接返回 `null`\n   *\n   * @param offsetSeconds 偏移量\n   */\n  isExpired(offsetSeconds: number = 0): boolean | null {\n    const exp = this.exp;\n    if (exp == null) return null;\n\n    return !(exp > new Date().valueOf() + offsetSeconds * 1000);\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { CanActivateChildFn, CanActivateFn, CanMatchFn } from '@angular/router';\n\nimport { CheckJwt, ToLogin } from '../helper';\nimport { DA_SERVICE_TOKEN } from '../interface';\nimport { JWTTokenModel } from './jwt.model';\n\n@Injectable({ providedIn: 'root' })\nexport class AuthJWTGuardService {\n  private readonly srv = inject(DA_SERVICE_TOKEN);\n\n  process(url?: string): boolean {\n    const cog = this.srv.options;\n    const res = CheckJwt(this.srv.get<JWTTokenModel>(JWTTokenModel), cog.token_exp_offset!);\n    if (!res) {\n      ToLogin(cog, url);\n    }\n    return res;\n  }\n}\n\n/**\n * JWT 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).\n *\n * ```ts\n * data: {\n *  path: 'home',\n *  canActivate: [ authJWTCanActivate ],\n *  data: { guard: 'user1' }\n * }\n * ```\n */\nexport const authJWTCanActivate: CanActivateFn = (_, state) => inject(AuthJWTGuardService).process(state.url);\n\n/**\n * JWT 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).\n *\n * ```ts\n * data: {\n *  path: 'home',\n *  canActivateChild: [ authJWTCanActivateChild ],\n *  data: { guard: 'user1' }\n * }\n * ```\n */\nexport const authJWTCanActivateChild: CanActivateChildFn = (_, state) => inject(AuthJWTGuardService).process(state.url);\n\n/**\n * JWT 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).\n *\n * ```ts\n * data: {\n *  path: 'home',\n *  canMatch: [ authJWTCanMatch ],\n *  data: { guard: 'user1' }\n * }\n * ```\n */\nexport const authJWTCanMatch: CanMatchFn = route => inject(AuthJWTGuardService).process(route.path);\n","import { HttpContextToken } from '@angular/common/http';\n\n/**\n * Whether to allow anonymous login\n *\n * 是否允许匿名登录\n *\n * @example\n * this.http.post(`login`, {\n *  name: 'cipchk', pwd: '123456'\n * }, {\n *  context: new HttpContext().set(ALLOW_ANONYMOUS, true)\n * })\n */\nexport const ALLOW_ANONYMOUS = new HttpContextToken(() => false);\n","import { HttpErrorResponse, HttpEvent, HttpRequest } from '@angular/common/http';\nimport { Observable, Observer } from 'rxjs';\n\nimport { AlainAuthConfig } from '@delon/util/config';\n\nimport { ALLOW_ANONYMOUS } from '../token';\nimport { ToLogin } from './helper';\n\nexport function isAnonymous(req: HttpRequest<unknown>, options: AlainAuthConfig): boolean {\n  if (req.context.get(ALLOW_ANONYMOUS)) return true;\n  if (Array.isArray(options.ignores)) {\n    for (const item of options.ignores) {\n      if (item.test(req.url)) return true;\n    }\n  }\n  return false;\n}\n\nexport function throwErr(req: HttpRequest<unknown>, options: AlainAuthConfig): Observable<HttpEvent<unknown>> {\n  ToLogin(options);\n\n  // Interrupt Http request, so need to generate a new Observable\n  return new Observable((observer: Observer<HttpEvent<any>>) => {\n    let statusText = '';\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      statusText = `来自 @delon/auth 的拦截，所请求URL未授权，若是登录API可加入 new HttpContext().set(ALLOW_ANONYMOUS, true) 来表示忽略校验，更多方法请参考： https://ng-alain.com/auth/getting-started#AlainAuthConfig\\nThe interception from @delon/auth, the requested URL is not authorized. If the login API can add new HttpContext().set(ALLOW_ANONYMOUS, true) to ignore the check, please refer to: https://ng-alain.com/auth/getting-started#AlainAuthConfig`;\n    }\n    const res = new HttpErrorResponse({\n      url: req.url,\n      headers: req.headers,\n      status: 401,\n      statusText\n    });\n    observer.error(res);\n  });\n}\n","import { HttpInterceptorFn, HttpRequest } from '@angular/common/http';\nimport { inject } from '@angular/core';\n\nimport { AlainConfigService } from '@delon/util/config';\n\nimport { mergeConfig } from '../../auth.config';\nimport { isAnonymous, throwErr } from '../base.interceptor';\nimport { CheckJwt } from '../helper';\nimport { DA_SERVICE_TOKEN } from '../interface';\nimport { JWTTokenModel } from './jwt.model';\n\nfunction newReq(req: HttpRequest<unknown>, model: JWTTokenModel): HttpRequest<unknown> {\n  return req.clone({\n    setHeaders: {\n      Authorization: `Bearer ${model.token}`\n    }\n  });\n}\n\nexport const authJWTInterceptor: HttpInterceptorFn = (req, next) => {\n  const options = mergeConfig(inject(AlainConfigService));\n\n  if (isAnonymous(req, options)) return next(req);\n\n  const model = inject(DA_SERVICE_TOKEN).get<JWTTokenModel>(JWTTokenModel);\n  if (CheckJwt(model, options.token_exp_offset!)) return next(newReq(req, model));\n\n  return throwErr(req, options);\n};\n","import { Injectable, inject } from '@angular/core';\nimport { CanActivateChildFn, CanActivateFn, CanMatchFn } from '@angular/router';\n\nimport { CheckSimple, ToLogin } from '../helper';\nimport { DA_SERVICE_TOKEN } from '../interface';\nimport { SimpleTokenModel } from './simple.model';\n\n@Injectable({ providedIn: 'root' })\nexport class AuthSimpleGuardService {\n  private readonly srv = inject(DA_SERVICE_TOKEN);\n\n  process(url?: string): boolean {\n    const res = CheckSimple(this.srv.get() as SimpleTokenModel);\n    if (!res) {\n      ToLogin(this.srv.options, url);\n    }\n    return res;\n  }\n}\n\n/**\n * Simple 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).\n *\n * ```ts\n * data: {\n *  path: 'home',\n *  canActivate: [ authSimpleCanActivate ],\n *  data: { guard: 'user1' }\n * }\n * ```\n */\nexport const authSimpleCanActivate: CanActivateFn = (_, state) => inject(AuthSimpleGuardService).process(state.url);\n\n/**\n * Simple 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).\n *\n * ```ts\n * data: {\n *  path: 'home',\n *  canActivateChild: [ authSimpleCanActivateChild ],\n *  data: { guard: 'user1' }\n * }\n * ```\n */\nexport const authSimpleCanActivateChild: CanActivateChildFn = (_, state) =>\n  inject(AuthSimpleGuardService).process(state.url);\n\n/**\n * Simple 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).\n *\n * ```ts\n * data: {\n *  path: 'home',\n *  canMatch: [ authSimpleCanMatch ],\n *  data: { guard: 'user1' }\n * }\n * ```\n */\nexport const authSimpleCanMatch: CanMatchFn = route => inject(AuthSimpleGuardService).process(route.path);\n","import { HttpInterceptorFn, HttpRequest } from '@angular/common/http';\nimport { inject } from '@angular/core';\n\nimport { AlainAuthConfig, AlainConfigService } from '@delon/util/config';\n\nimport { mergeConfig } from '../../auth.config';\nimport { isAnonymous, throwErr } from '../base.interceptor';\nimport { CheckSimple } from '../helper';\nimport { DA_SERVICE_TOKEN } from '../interface';\nimport { SimpleTokenModel } from './simple.model';\n\nfunction newReq(req: HttpRequest<unknown>, model: SimpleTokenModel, options: AlainAuthConfig): HttpRequest<unknown> {\n  const { token_send_template, token_send_key } = options;\n  const token = token_send_template!.replace(/\\$\\{([\\w]+)\\}/g, (_: string, g) => model[g]);\n  switch (options.token_send_place) {\n    case 'header':\n      // eslint-disable-next-line no-case-declarations\n      const obj: any = {};\n      obj[token_send_key!] = token;\n      req = req.clone({\n        setHeaders: obj\n      });\n      break;\n    case 'body': {\n      const body: any = req.body ?? {};\n      body[token_send_key!] = token;\n      req = req.clone({\n        body\n      });\n      break;\n    }\n    case 'url':\n      req = req.clone({\n        params: req.params.append(token_send_key!, token)\n      });\n      break;\n  }\n  return req;\n}\n\nexport const authSimpleInterceptor: HttpInterceptorFn = (req, next) => {\n  const options = mergeConfig(inject(AlainConfigService));\n\n  if (isAnonymous(req, options)) return next(req);\n\n  const model = inject(DA_SERVICE_TOKEN).get() as SimpleTokenModel;\n  if (CheckSimple(model)) return next(newReq(req, model, options));\n\n  return throwErr(req, options);\n};\n","import { ITokenModel } from '../interface';\n\nexport class SimpleTokenModel implements ITokenModel {\n  [key: string]: any;\n\n  token: string | null | undefined;\n\n  expired?: number;\n}\n","import { EnvironmentProviders, Provider, makeEnvironmentProviders } from '@angular/core';\n\nimport { CookieService } from '@delon/util/browser';\n\nimport { CookieStorageStore, DA_STORE_TOKEN, LocalStorageStore, MemoryStore, SessionStorageStore } from './store';\n\nexport enum AuthFeatureKind {\n  Store\n}\n\nexport interface AuthFeature<KindT extends AuthFeatureKind> {\n  ɵkind: KindT;\n  ɵproviders: Provider[];\n}\n\nfunction makeAuthFeature<KindT extends AuthFeatureKind>(kind: KindT, providers: Provider[]): AuthFeature<KindT> {\n  return {\n    ɵkind: kind,\n    ɵproviders: providers\n  };\n}\n\n/**\n * Configures authentication process service to be available for injection.\n *\n * @see {@link withCookie}\n * @see {@link withLocalStorage}\n * @see {@link withSessionStorage}\n */\nexport function provideAuth(store?: AuthFeature<AuthFeatureKind.Store>): EnvironmentProviders {\n  return makeEnvironmentProviders([(store ?? withLocalStorage()).ɵproviders]);\n}\n\n/** `cookie` storage */\nexport function withCookie(): AuthFeature<AuthFeatureKind.Store> {\n  return makeAuthFeature(AuthFeatureKind.Store, [\n    { provide: DA_STORE_TOKEN, useClass: CookieStorageStore, deps: [CookieService] }\n  ]);\n}\n\n/** `localStorage` storage, **not lost after closing the browser**. */\nexport function withLocalStorage(): AuthFeature<AuthFeatureKind.Store> {\n  return makeAuthFeature(AuthFeatureKind.Store, [{ provide: DA_STORE_TOKEN, useClass: LocalStorageStore }]);\n}\n\n/** `sessionStorage` storage, **lost after closing the browser**. */\nexport function withSessionStorage(): AuthFeature<AuthFeatureKind.Store> {\n  return makeAuthFeature(AuthFeatureKind.Store, [{ provide: DA_STORE_TOKEN, useClass: SessionStorageStore }]);\n}\n\n/** Memory storage, **lost after closing the browser tab**. */\nexport function withMemoryStorage(): AuthFeature<AuthFeatureKind.Store> {\n  return makeAuthFeature(AuthFeatureKind.Store, [{ provide: DA_STORE_TOKEN, useClass: MemoryStore }]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["newReq"],"mappings":";;;;;;;;;AAEO,MAAM,mBAAmB,GAAoB;AAClD,IAAA,SAAS,EAAE,CAAA,MAAA,CAAQ;AACnB,IAAA,sBAAsB,EAAE,IAAI;AAC5B,IAAA,gBAAgB,EAAE,EAAE;AACpB,IAAA,cAAc,EAAE,CAAA,KAAA,CAAO;AACvB,IAAA,mBAAmB,EAAE,UAAU;AAC/B,IAAA,gBAAgB,EAAE,QAAQ;AAC1B,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,aAAa,EAAE,IAAI;IACnB,OAAO,EAAE,CAAC,YAAY;;AAGlB,SAAU,WAAW,CAAC,GAAuB,EAAA;IACjD,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,mBAAmB,CAAE;AAChD;;SCdgB,4BAA4B,GAAA;IAC1C,OAAO,IAAI,iBAAiB,EAAE;AAChC;AAEA;;;;;;;AAOG;MACU,iBAAiB,CAAA;AAC5B,IAAA,GAAG,CAAC,GAAW,EAAA;AACb,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;IAC5D;IAEA,GAAG,CAAC,GAAW,EAAE,KAAyB,EAAA;AACxC,QAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAChD,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,CAAC,GAAW,EAAA;AAChB,QAAA,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;IAC9B;AACD;;MCvBY,cAAc,GAAG,IAAI,cAAc,CAAS,kBAAkB,EAAE;AAC3E,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE;AACV,CAAA;;SCCe,wBAAwB,GAAA;IACtC,OAAO,IAAI,YAAY,EAAE;AAC3B;AAEA;;AAEG;MAEU,YAAY,CAAA;AACN,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC5C,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAe;AACrC,IAAA,OAAO,GAAG,IAAI,eAAe,CAAqB,IAAI,CAAC;AACvD,IAAA,SAAS;IACT,SAAS,GAAiB,EAAE;AAC5B,IAAA,QAAQ;AAEhB,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1C;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,IAAI,CAAC,cAAc,EAAE;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpC;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS;IAChC;AAEA,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;IACvB;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;IACtB;AAEA,IAAA,GAAG,CAAC,IAAiB,EAAA;AACnB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAU,EAAE,IAAI,CAAC;AAC1D,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AACvB,QAAA,OAAO,GAAG;IACZ;AAIA,IAAA,GAAG,CAAwB,IAAkB,EAAA;AAC3C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAU,CAAC;AACrD,QAAA,OAAO,IAAI,GAAI,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAO,GAAI,IAAU;IACpE;AAEA,IAAA,KAAK,CAAC,OAAA,GAAkC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAA;QAC1D,IAAI,IAAI,GAAuB,IAAI;AACnC,QAAA,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE;AAC9B,YAAA,IAAI,GAAG,IAAI,CAAC,GAAG,EAAiB;AAChC,YAAA,IAAI,CAAC,KAAK,GAAG,CAAA,CAAE;AACf,YAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAChB;aAAO;YACL,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAU,CAAC;QAC7C;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;IACzB;IAEA,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACnC;IAEQ,cAAc,GAAA;QACpB,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,QAAQ;QACpD,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,WAAW;AAClC,aAAA,IAAI,CACH,GAAG,CAAC,MAAK;AACP,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAiB;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;AAC7C,YAAA,IAAI,OAAO,IAAI,CAAC,EAAE;AAChB,gBAAA,OAAO,IAAI;YACb;YAEA,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,aAAc;YACrD,OAAO,OAAO,IAAI,OAAO,GAAG,IAAI,GAAG,IAAI;AACzC,QAAA,CAAC,CAAC,EACF,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAEvB,aAAA,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAI,CAAC,CAAC;IAC/C;IAEQ,YAAY,GAAA;QAClB,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;AAC5C,YAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;QAC9B;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,YAAY,EAAE;IACrB;wGAvFW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAZ,YAAY,EAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB;;;MCTY,gBAAgB,GAAG,IAAI,cAAc,CAAgB,kBAAkB,EAAE;AACpF,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE;AACV,CAAA;;ACHD,MAAM,QAAQ,GAAG,sBAAsB;AACvC,MAAM,YAAY,GAAG,gCAAgC;MAKxC,aAAa,CAAA;AACP,IAAA,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACvC,IAAA,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;AACtB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAEhC,IAAI,GAAkB,IAAI;AAC1B,IAAA,QAAQ;AACR,IAAA,QAAQ;AAgChB;;;;;;;AAOG;AACH,IAAA,KAAK,CACH,GAAW,EACX,WAAmB,GAAG,EACtB,UAGI,EAAE,EAAA;AAEN,QAAA,OAAO,GAAG;AACR,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,cAAc,EAAE,6DAA6D;AAC7E,YAAA,GAAG;SACJ;QACD,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAK,CAAC;AAC7C,QAAA,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;AAC5C,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;YAC3B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG;YAC5B;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC;AAC9D,QAAA,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,MAAK;YAC/B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBACjC,IAAI,CAAC,WAAW,EAAE;gBAElB,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE;AACnC,gBAAA,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK;oBAAE,KAAK,GAAG,IAAI;;gBAGvC,IAAI,KAAK,EAAE;AACT,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC9B;AAEA,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACzB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;YAC1B;QACF,CAAC,EAAE,GAAG,CAAC;AACP,QAAA,OAAO,IAAI,UAAU,CAAC,CAAC,QAAsC,KAAI;AAC/D,YAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AAC1B,QAAA,CAAC,CAAC;IACJ;AAEA;;;;AAIG;AACH,IAAA,QAAQ,CAAC,OAAqC,EAAA;;AAE5C,QAAA,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;AACnD,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,CAAsB,CAAC;QACzC;;AAEA,QAAA,IAAI,IAAI,GAAgB,EAAE,KAAK,EAAE,CAAA,CAAE,EAAE;AACrC,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,YAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpD,YAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAE,CAAC,CAAC,WAA0B;QAC1E;aAAO;YACL,IAAI,GAAG,OAAsB;QAC/B;AAEA,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,mBAAA,CAAqB,CAAC;AAChE,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAE3B,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,GAAG;AACrD,QAAA,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC;QACrC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC3C,QAAA,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;AACjC,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;YACrB,MAAM,CAAC,KAAK,EAAE;QAChB;aAAO;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;QAChC;AAEA,QAAA,OAAO,IAAI;IACb;IAEA,WAAW,GAAA;AACT,QAAA,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;wGA/HW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAb,aAAa,EAAA,CAAA;;4FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB;;;ACTD;;AAEG;MACU,WAAW,CAAA;IACd,KAAK,GAAuC,EAAE;AAEtD,IAAA,GAAG,CAAC,GAAW,EAAA;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAK,EAAkB;IAC/C;IAEA,GAAG,CAAC,GAAW,EAAE,KAAkB,EAAA;AACjC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK;AACvB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,CAAC,GAAW,EAAA;AAChB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI;IACxB;AACD;;AClBD;;;;;;;AAOG;MACU,mBAAmB,CAAA;AAC9B,IAAA,GAAG,CAAC,GAAW,EAAA;AACb,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;IAC9D;IAEA,GAAG,CAAC,GAAW,EAAE,KAAyB,EAAA;AACxC,QAAA,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAClD,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,CAAC,GAAW,EAAA;AAChB,QAAA,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC;IAChC;AACD;;ACjBD;;;;;;;AAOG;MACU,kBAAkB,CAAA;AACZ,IAAA,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;AAE5C,IAAA,GAAG,CAAC,GAAW,EAAA;AACb,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;QAC9C;QAAE,OAAO,EAAE,EAAE;AACX,YAAA,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,EAAE;gBACjD,OAAO,CAAC,KAAK,CAAC,CAAA,6CAAA,EAAgD,GAAG,CAAA,CAAE,EAAE,EAAE,CAAC;YAC1E;AACA,YAAA,OAAO,EAAiB;QAC1B;IACF;IAEA,GAAG,CAAC,GAAW,EAAE,KAAqC,EAAA;QACpD,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,IAAI,GAAG;QAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;AAC3D,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,CAAC,GAAW,EAAA;AAChB,QAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;IACtB;AACD;;AC5BK,SAAU,WAAW,CAAC,KAA8B,EAAA;AACxD,IAAA,OAAO,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;AACnF;AAEM,SAAU,QAAQ,CAAC,KAAoB,EAAE,MAAc,EAAA;AAC3D,IAAA,IAAI;AACF,QAAA,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;IACnE;IAAE,OAAO,GAAY,EAAE;AACrB,QAAA,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,EAAE;YACjD,OAAO,CAAC,IAAI,CAAC,CAAA,EAAI,GAA2B,CAAC,OAAO,CAAA,mBAAA,CAAqB,CAAC;QAC5E;AACA,QAAA,OAAO,KAAK;IACd;AACF;AAEM,SAAU,OAAO,CAAC,OAAwB,EAAE,GAAY,EAAA;AAC5D,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAkB;AACvD,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC5B,KAAK,CAAC,QAAS,CAAC,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG;AACvC,IAAA,IAAI,OAAO,CAAC,sBAAsB,KAAK,IAAI,EAAE;QAC3C,UAAU,CAAC,MAAK;YACd,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,SAAU,CAAC,EAAE;gBAC5C,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,SAAmB;YACjD;iBAAO;gBACL,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACtC;AACF,QAAA,CAAC,CAAC;IACJ;AACF;;ACvCM,SAAU,eAAe,CAAC,GAAW,EAAA;AACzC,IAAA,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AACtD,IAAA,QAAQ,MAAM,CAAC,MAAM,GAAG,CAAC;QACvB,KAAK,CAAC,EAAE;YACN;QACF;QACA,KAAK,CAAC,EAAE;YACN,MAAM,IAAI,IAAI;YACd;QACF;QACA,KAAK,CAAC,EAAE;YACN,MAAM,IAAI,GAAG;YACb;QACF;QACA,SAAS;AACP,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,iEAAA,CAAmE,CAAC;QACtF;;AAEF,IAAA,OAAO,gBAAgB,CAAC,MAAM,CAAC;AACjC;AAEA,SAAS,SAAS,CAAC,GAAW,EAAA;IAC5B,MAAM,KAAK,GAAG,mEAAmE;IACjF,IAAI,MAAM,GAAG,EAAE;AAEf,IAAA,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAEpC,IAAA;;IAGE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAO,EAAE,MAAW,EAAE,GAAG,GAAG,CAAC;;KAExC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;;AAE3B,IAAA,CAAC,MAAM;AACP,SAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,MAAM;;;YAGzC,EAAE,EAAE,GAAG,CAAC;WACH,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;UAC7D,CAAC,EACL;;AAEA,QAAA,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;IAChC;AACA,IAAA,OAAO,MAAM;AACf;AAEA;AACA,SAAS,gBAAgB,CAAC,GAAW,EAAA;AACnC,IAAA,OAAO,kBAAkB,CACvB,KAAK,CAAC,SAAS,CAAC;SACb,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAS,KAAI;QAClC,OAAO,CAAA,CAAA,EAAI,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE;AAC5D,IAAA,CAAC;AACA,SAAA,IAAI,CAAC,EAAE,CAAC,CACZ;AACH;;MCpBa,aAAa,CAAA;AAGxB,IAAA,KAAK;AAEL,IAAA,OAAO;AAEP;;AAEG;AACH,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC;AAC3C,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC;QAEhE,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IAC5B;AAEA;;AAEG;AACH,IAAA,IAAI,GAAG,GAAA;AACL,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;AACtE,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC;AAC/B,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE;IACvB;AAEA;;;;AAIG;IACH,SAAS,CAAC,gBAAwB,CAAC,EAAA;AACjC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG;QACpB,IAAI,GAAG,IAAI,IAAI;AAAE,YAAA,OAAO,IAAI;AAE5B,QAAA,OAAO,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,aAAa,GAAG,IAAI,CAAC;IAC7D;AACD;;MCrEY,mBAAmB,CAAA;AACb,IAAA,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE/C,IAAA,OAAO,CAAC,GAAY,EAAA;AAClB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO;AAC5B,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAgB,aAAa,CAAC,EAAE,GAAG,CAAC,gBAAiB,CAAC;QACvF,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;QACnB;AACA,QAAA,OAAO,GAAG;IACZ;wGAVW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA;;4FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAclC;;;;;;;;;;AAUG;MACU,kBAAkB,GAAkB,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;AAE5G;;;;;;;;;;AAUG;MACU,uBAAuB,GAAuB,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;AAEtH;;;;;;;;;;AAUG;AACI,MAAM,eAAe,GAAe,KAAK,IAAI,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI;;ACxDlG;;;;;;;;;;;AAWG;AACI,MAAM,eAAe,GAAG,IAAI,gBAAgB,CAAC,MAAM,KAAK;;ACNzD,SAAU,WAAW,CAAC,GAAyB,EAAE,OAAwB,EAAA;AAC7E,IAAA,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AAAE,QAAA,OAAO,IAAI;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAClC,QAAA,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE;AAClC,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAO,IAAI;QACrC;IACF;AACA,IAAA,OAAO,KAAK;AACd;AAEM,SAAU,QAAQ,CAAC,GAAyB,EAAE,OAAwB,EAAA;IAC1E,OAAO,CAAC,OAAO,CAAC;;AAGhB,IAAA,OAAO,IAAI,UAAU,CAAC,CAAC,QAAkC,KAAI;QAC3D,IAAI,UAAU,GAAG,EAAE;AACnB,QAAA,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,EAAE;YACjD,UAAU,GAAG,gZAAgZ;QAC/Z;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC;YAChC,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,OAAO,EAAE,GAAG,CAAC,OAAO;AACpB,YAAA,MAAM,EAAE,GAAG;YACX;AACD,SAAA,CAAC;AACF,QAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;AACrB,IAAA,CAAC,CAAC;AACJ;;ACxBA,SAASA,QAAM,CAAC,GAAyB,EAAE,KAAoB,EAAA;IAC7D,OAAO,GAAG,CAAC,KAAK,CAAC;AACf,QAAA,UAAU,EAAE;AACV,YAAA,aAAa,EAAE,CAAA,OAAA,EAAU,KAAK,CAAC,KAAK,CAAA;AACrC;AACF,KAAA,CAAC;AACJ;MAEa,kBAAkB,GAAsB,CAAC,GAAG,EAAE,IAAI,KAAI;IACjE,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAEvD,IAAA,IAAI,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC;IAE/C,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAgB,aAAa,CAAC;AACxE,IAAA,IAAI,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,gBAAiB,CAAC;QAAE,OAAO,IAAI,CAACA,QAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAE/E,IAAA,OAAO,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;AAC/B;;MCpBa,sBAAsB,CAAA;AAChB,IAAA,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE/C,IAAA,OAAO,CAAC,GAAY,EAAA;QAClB,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAsB,CAAC;QAC3D,IAAI,CAAC,GAAG,EAAE;YACR,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;QAChC;AACA,QAAA,OAAO,GAAG;IACZ;wGATW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cADT,MAAM,EAAA,CAAA;;4FACnB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAalC;;;;;;;;;;AAUG;MACU,qBAAqB,GAAkB,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;AAElH;;;;;;;;;;AAUG;MACU,0BAA0B,GAAuB,CAAC,CAAC,EAAE,KAAK,KACrE,MAAM,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;AAElD;;;;;;;;;;AAUG;AACI,MAAM,kBAAkB,GAAe,KAAK,IAAI,MAAM,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI;;AC/CxG,SAAS,MAAM,CAAC,GAAyB,EAAE,KAAuB,EAAE,OAAwB,EAAA;AAC1F,IAAA,MAAM,EAAE,mBAAmB,EAAE,cAAc,EAAE,GAAG,OAAO;IACvD,MAAM,KAAK,GAAG,mBAAoB,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAS,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC;AACxF,IAAA,QAAQ,OAAO,CAAC,gBAAgB;AAC9B,QAAA,KAAK,QAAQ;;YAEX,MAAM,GAAG,GAAQ,EAAE;AACnB,YAAA,GAAG,CAAC,cAAe,CAAC,GAAG,KAAK;AAC5B,YAAA,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;AACd,gBAAA,UAAU,EAAE;AACb,aAAA,CAAC;YACF;QACF,KAAK,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,GAAQ,GAAG,CAAC,IAAI,IAAI,EAAE;AAChC,YAAA,IAAI,CAAC,cAAe,CAAC,GAAG,KAAK;AAC7B,YAAA,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;gBACd;AACD,aAAA,CAAC;YACF;QACF;AACA,QAAA,KAAK,KAAK;AACR,YAAA,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,cAAe,EAAE,KAAK;AACjD,aAAA,CAAC;YACF;;AAEJ,IAAA,OAAO,GAAG;AACZ;MAEa,qBAAqB,GAAsB,CAAC,GAAG,EAAE,IAAI,KAAI;IACpE,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAEvD,IAAA,IAAI,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC;IAE/C,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,EAAsB;IAChE,IAAI,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAEhE,IAAA,OAAO,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;AAC/B;;MC/Ca,gBAAgB,CAAA;AAG3B,IAAA,KAAK;AAEL,IAAA,OAAO;AACR;;ICFW;AAAZ,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,eAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAK;AACP,CAAC,EAFW,eAAe,KAAf,eAAe,GAAA,EAAA,CAAA,CAAA;AAS3B,SAAS,eAAe,CAAgC,IAAW,EAAE,SAAqB,EAAA;IACxF,OAAO;AACL,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,UAAU,EAAE;KACb;AACH;AAEA;;;;;;AAMG;AACG,SAAU,WAAW,CAAC,KAA0C,EAAA;AACpE,IAAA,OAAO,wBAAwB,CAAC,CAAC,CAAC,KAAK,IAAI,gBAAgB,EAAE,EAAE,UAAU,CAAC,CAAC;AAC7E;AAEA;SACgB,UAAU,GAAA;AACxB,IAAA,OAAO,eAAe,CAAC,eAAe,CAAC,KAAK,EAAE;AAC5C,QAAA,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,aAAa,CAAC;AAC/E,KAAA,CAAC;AACJ;AAEA;SACgB,gBAAgB,GAAA;AAC9B,IAAA,OAAO,eAAe,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAC3G;AAEA;SACgB,kBAAkB,GAAA;AAChC,IAAA,OAAO,eAAe,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC,CAAC;AAC7G;AAEA;SACgB,iBAAiB,GAAA;AAC/B,IAAA,OAAO,eAAe,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;AACrG;;ACrDA;;AAEG;;;;"}