{"version":3,"file":"starchild-auth.umd.cjs","sources":["../src/utils.ts","../src/errors.ts","../src/StarchildAuth.ts"],"sourcesContent":["/**\n * Generate a cryptographically random nonce for CSRF protection.\n * Falls back to Math.random if the Web Crypto API is unavailable.\n */\nexport function generateNonce(): string {\n  try {\n    const arr = new Uint8Array(16)\n    crypto.getRandomValues(arr)\n    return Array.from(arr, (b) => b.toString(16).padStart(2, '0')).join('')\n  } catch {\n    return Math.random().toString(36).slice(2) + Math.random().toString(36).slice(2)\n  }\n}\n\n/**\n * Calculate centered popup window features string.\n */\nexport function popupFeatures(width: number, height: number): string {\n  const left = Math.max(0, Math.round((screen.width - width) / 2))\n  const top = Math.max(0, Math.round((screen.height - height) / 2))\n  return [\n    `width=${width}`,\n    `height=${height}`,\n    `left=${left}`,\n    `top=${top}`,\n    'scrollbars=yes',\n    'resizable=yes',\n    'status=no',\n    'toolbar=no',\n    'menubar=no',\n    'location=no',\n  ].join(',')\n}\n","/**\n * Unified SDK / HTTP error thrown by StarchildAuth API helpers.\n *\n * Use `error.status` and `error.insufficientScope` to branch UX\n * (e.g. prompt re-login with broader scopes on 403).\n */\nexport class StarchildAuthError extends Error {\n  /** HTTP status code (0 for network / parse failures without a response). */\n  readonly status: number\n  /** Optional machine-readable code from the API body. */\n  readonly code?: string\n  /** Raw `detail` / body payload from the server when available. */\n  readonly detail?: unknown\n  /** Request path (relative or absolute) for debugging. */\n  readonly path?: string\n  /** True when the failure is an OAuth insufficient_scope style 403. */\n  readonly insufficientScope: boolean\n  /** Original Response when available. */\n  readonly response?: Response\n\n  constructor(\n    message: string,\n    options: {\n      status?: number\n      code?: string\n      detail?: unknown\n      path?: string\n      insufficientScope?: boolean\n      response?: Response\n      cause?: unknown\n    } = {},\n  ) {\n    super(message)\n    this.name = 'StarchildAuthError'\n    this.status = options.status ?? 0\n    this.code = options.code\n    this.detail = options.detail\n    this.path = options.path\n    this.insufficientScope = options.insufficientScope ?? false\n    this.response = options.response\n    // Attach cause when runtime supports it (ES2022+)\n    if (options.cause !== undefined) {\n      try {\n        ;(this as Error & { cause?: unknown }).cause = options.cause\n      } catch {\n        /* ignore */\n      }\n    }\n  }\n\n  static fromResponse(res: Response, body: unknown, path?: string): StarchildAuthError {\n    const parsed = normalizeErrorBody(body)\n    const insufficientScope =\n      res.status === 403 &&\n      (looksLikeInsufficientScope(parsed.message) ||\n        looksLikeInsufficientScope(parsed.code) ||\n        looksLikeInsufficientScope(stringifyDetail(parsed.detail)))\n\n    return new StarchildAuthError(parsed.message || `Request failed (${res.status})`, {\n      status: res.status,\n      code: parsed.code,\n      detail: parsed.detail ?? body,\n      path,\n      insufficientScope,\n      response: res,\n    })\n  }\n}\n\nfunction looksLikeInsufficientScope(value?: string | null): boolean {\n  if (!value) return false\n  const v = value.toLowerCase()\n  return (\n    v.includes('insufficient scope') ||\n    v.includes('insufficient_scope') ||\n    v.includes('credit:read') ||\n    v.includes('credit:write') ||\n    (v.includes('scope') && (v.includes('required') || v.includes('missing')))\n  )\n}\n\nfunction stringifyDetail(detail: unknown): string {\n  if (detail == null) return ''\n  if (typeof detail === 'string') return detail\n  try {\n    return JSON.stringify(detail)\n  } catch {\n    return String(detail)\n  }\n}\n\nfunction normalizeErrorBody(body: unknown): { message: string; code?: string; detail?: unknown } {\n  if (body == null || body === '') {\n    return { message: 'Request failed' }\n  }\n  if (typeof body === 'string') {\n    return { message: body, detail: body }\n  }\n  if (typeof body !== 'object') {\n    return { message: String(body), detail: body }\n  }\n\n  const o = body as Record<string, unknown>\n  const detail = o.detail ?? o.error ?? o.message ?? o.msg\n  let message = ''\n  let code: string | undefined\n\n  if (typeof o.code === 'string') code = o.code\n  else if (typeof o.error_code === 'string') code = o.error_code\n  else if (typeof o.error === 'string' && o.error === o.error.toUpperCase()) code = o.error\n\n  if (typeof detail === 'string') {\n    message = detail\n  } else if (Array.isArray(detail)) {\n    // FastAPI validation errors: [{ loc, msg, type }, ...]\n    message = detail\n      .map((item) => {\n        if (item && typeof item === 'object' && 'msg' in (item as object)) {\n          return String((item as { msg: unknown }).msg)\n        }\n        return stringifyDetail(item)\n      })\n      .filter(Boolean)\n      .join('; ')\n  } else if (detail && typeof detail === 'object') {\n    const d = detail as Record<string, unknown>\n    if (typeof d.message === 'string') message = d.message\n    else if (typeof d.error === 'string') message = d.error\n    else message = stringifyDetail(detail)\n    if (typeof d.code === 'string') code = code ?? d.code\n  }\n\n  if (!message && typeof o.message === 'string') message = o.message\n  if (!message && typeof o.error === 'string') message = o.error\n  if (!message) message = 'Request failed'\n\n  return { message, code, detail: detail ?? body }\n}\n\n/**\n * Read response body as JSON (or text fallback) and throw {@link StarchildAuthError} on non-2xx.\n */\nexport async function parseApiResponse<T>(res: Response, path?: string): Promise<T> {\n  const text = await res.text()\n  let data: unknown = null\n  if (text) {\n    try {\n      data = JSON.parse(text)\n    } catch {\n      data = text\n    }\n  }\n  if (!res.ok) {\n    throw StarchildAuthError.fromResponse(res, data, path)\n  }\n  return data as T\n}\n","import type {\n  StarchildAuthOptions,\n  UserInfo,\n  LoginResult,\n  StarchildMessage,\n  AuthSuccessMessage,\n  Thread,\n  ThreadListResponse,\n  ThreadSearchResponse,\n  MessageListResponse,\n  Container,\n  ContainerListResponse,\n  ContainerStatus,\n  ContainerMetrics,\n  SkillCatalogResponse,\n  SkillDetail,\n  ModelInfo,\n  ImageUploadResponse,\n  TranscribeResponse,\n  SynthesizeResponse,\n  Share,\n  ShareListResponse,\n  Job,\n  JobListResponse,\n  WalletPortfolio,\n  WalletListResponse,\n  WalletInfo,\n  OnrampSession,\n  ComputeSpec,\n  FreeQuota,\n  OkResponse,\n  SendMessageOptions,\n  // Credits (starchild-credit-api)\n  CreditBalance,\n  CreditChargesParams,\n  CreditChargesResponse,\n  CreditTopupsParams,\n  CreditTopupsResponse,\n  CreditDailyUsageParams,\n  CreditDailyUsageResponse,\n  PendingCreditResponse,\n  CreditTxStatus,\n  StripeCreateSessionRequest,\n  StripeCreateSessionResponse,\n  RedeemGiftCardRequest,\n  RedeemGiftCardResponse,\n  PointsExchangeBalance,\n  PointsExchangeRequest,\n  PointsExchangeResponse,\n  KycStatus,\n  KycSetupIntentResponse,\n  KycVerifyRequest,\n  KycVerifyResponse,\n  ReferralStatus,\n  ReferralBindRequest,\n  ReferralBindResponse,\n  ReferralInviteesResponse,\n  MigrationRewardStatus,\n  MigrationRewardClaimResponse,\n  WooBonusResponse,\n} from './types'\nimport { generateNonce, popupFeatures } from './utils'\nimport { StarchildAuthError, parseApiResponse } from './errors'\n\n/** Production defaults — integrators hit live Starchild unless they override. */\nconst DEFAULT_ORIGIN = 'https://iamstarchild.com'\nconst DEFAULT_API_BASE = 'https://go-api.iamstarchild.com/v1'\nconst DEFAULT_CHAT_API_BASE = 'https://ai-api.iamstarchild.com'\n/** Clawd HTTP — starchild-web workspaceDomain.restfulDomain (pro) */\nconst DEFAULT_CLAWD_API_BASE = 'https://preview.iamstarchild.com'\n/** Clawd WS — starchild-web workspaceDomain.wsDomain (pro) */\nconst DEFAULT_CLAWD_WS_BASE = 'wss://preview.iamstarchild.com'\nconst DEFAULT_CREDIT_API_BASE = 'https://credit.iamstarchild.com'\nconst DEFAULT_POPUP_WIDTH = 480\nconst DEFAULT_POPUP_HEIGHT = 640\nconst DEFAULT_REFRESH_INTERVAL = 12 * 60 * 1000 // 12 minutes\n\ninterface PendingLogin {\n  resolve: (result: LoginResult) => void\n  reject: (error: Error) => void\n  state: string\n}\n\n/**\n * Starchild Auth SDK (V2) — enables third-party websites to integrate Starchild SSO login\n * via the OAuth Client registration model.\n *\n * Key differences from V1:\n * - `clientId` is required\n * - Token refresh uses direct API calls instead of hidden iframes\n * - `refreshToken` is persisted in localStorage for session restoration\n *\n * @example\n * ```ts\n * const auth = new StarchildAuth({\n *   clientId: 'your-client-id',\n *   onLogin: ({ accessToken, refreshToken, expiresIn, userInfo }) => {\n *     console.log('Logged in as', userInfo.agentName)\n *   },\n *   onTokenRefresh: (newToken) => {\n *     // Update your stored token\n *   },\n *   onTokenRefreshFailed: () => {\n *     // Session expired, prompt re-login\n *   },\n * })\n *\n * // User clicks \"Sign in\"\n * const { accessToken, userInfo } = await auth.login()\n * ```\n */\nexport class StarchildAuth {\n  // ── Configuration ──────────────────────────────────────────────────────────\n  private readonly _clientId: string\n  private readonly _scope: string\n  private readonly _origin: string\n  private readonly _apiBase: string        // go-api: auth/wallet/payment\n  private readonly _chatApiBase: string     // ai-agent: threads, messages, containers, skills, shares, points, quests, agent, etc.\n  private readonly _clawdApiBase: string    // clawd HTTP: chat/stream, scheduled-jobs\n  private readonly _clawdWsBase: string     // clawd WS: /ws/sync|terminal|metrics\n  private readonly _creditApiBase: string   // credit-api: balance, charges, stripe, points, kyc, referral\n  private readonly _popupWidth: number\n  private readonly _popupHeight: number\n  private readonly _refreshInterval: number\n\n  // ── Callbacks ──────────────────────────────────────────────────────────────\n  private readonly _onLogin: ((result: LoginResult) => void) | null\n  private readonly _onLogout: (() => void) | null\n  private readonly _onTokenRefresh: ((accessToken: string) => void) | null\n  private readonly _onTokenRefreshFailed: (() => void) | null\n\n  // ── State ──────────────────────────────────────────────────────────────────\n  private _accessToken: string | null = null\n  private _refreshToken: string | null = null\n  private _userInfo: UserInfo | null = null\n  private _actionToken: string | null = null\n  private _destroyed = false\n\n  // ── Clawd container routing ───────────────────────────────────────────────\n  // Clawd (preview.iamstarchild.com) requires fly-force-instance-id to route\n  // requests to the caller's own container. OAuth access tokens do not carry\n  // a containerId, so resolve it lazily via ai-agent /api/cloud/containers.\n  private _containerId: string | null = null\n  private _containerIdPromise: Promise<string | null> | null = null\n\n  // ── Pending operations ─────────────────────────────────────────────────────\n  private _pendingLogin: PendingLogin | null = null\n\n  // ── Timers ─────────────────────────────────────────────────────────────────\n  private _refreshTimer: ReturnType<typeof setInterval> | null = null\n  private _popupPollTimer: ReturnType<typeof setInterval> | null = null\n\n  // ── Bound handlers ─────────────────────────────────────────────────────────\n  private readonly _handleMessage: (event: MessageEvent) => void\n  private readonly _handleVisibility: () => void\n\n  constructor(options: StarchildAuthOptions) {\n    if (!options?.clientId) {\n      throw new Error('StarchildAuth: clientId is required. Obtain one from the Starchild Developer Console.')\n    }\n\n    this._clientId = options.clientId\n    this._scope = options.scope ?? 'profile'\n    this._origin = options.origin ?? DEFAULT_ORIGIN\n    this._apiBase = options.apiBase ?? DEFAULT_API_BASE\n    this._chatApiBase = options.chatApiBase ?? DEFAULT_CHAT_API_BASE\n    // Independent of chatApiBase — web workspaceDomain uses preview.iamstarchild.com\n    this._clawdApiBase = options.clawdApiBase ?? DEFAULT_CLAWD_API_BASE\n    // Explicit WS base like web wsDomain; if only clawdApiBase overridden, derive scheme.\n    if (options.clawdWsBase) {\n      this._clawdWsBase = options.clawdWsBase.replace(/\\/$/, '')\n    } else if (options.clawdApiBase) {\n      this._clawdWsBase = options.clawdApiBase\n        .replace(/\\/$/, '')\n        .replace(/^https:/i, 'wss:')\n        .replace(/^http:/i, 'ws:')\n    } else {\n      this._clawdWsBase = DEFAULT_CLAWD_WS_BASE\n    }\n    this._creditApiBase = options.creditApiBase ?? DEFAULT_CREDIT_API_BASE\n    this._popupWidth = options.popupWidth ?? DEFAULT_POPUP_WIDTH\n    this._popupHeight = options.popupHeight ?? DEFAULT_POPUP_HEIGHT\n    this._refreshInterval = options.refreshInterval ?? DEFAULT_REFRESH_INTERVAL\n\n    this._onLogin = options.onLogin ?? null\n    this._onLogout = options.onLogout ?? null\n    this._onTokenRefresh = options.onTokenRefresh ?? null\n    this._onTokenRefreshFailed = options.onTokenRefreshFailed ?? null\n\n    // Bind event handlers\n    this._handleMessage = this._onMessage.bind(this)\n    this._handleVisibility = this._onVisibilityChange.bind(this)\n\n    window.addEventListener('message', this._handleMessage)\n    document.addEventListener('visibilitychange', this._handleVisibility)\n\n    // Auto-login: attempt to restore session from stored refreshToken\n    if (options.autoLogin !== false) {\n      this._tryAutoLogin()\n    }\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // Public API\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Open a popup window for the user to sign in with Starchild.\n   *\n   * If the user already has a valid session, the popup will auto-complete\n   * and close almost instantly (similar to Google One Tap).\n   *\n   * @returns Promise resolving with `{ accessToken, refreshToken, expiresIn, userInfo }`\n   * @throws If the popup is blocked or the user closes it before completing login\n   */\n  login(): Promise<LoginResult> {\n    if (this._destroyed) {\n      return Promise.reject(new Error('StarchildAuth instance has been destroyed'))\n    }\n\n    return new Promise<LoginResult>((resolve, reject) => {\n      const state = generateNonce()\n      this._pendingLogin = { resolve, reject, state }\n\n      const url =\n        `${this._origin}/auth-popup` +\n        `?client_id=${encodeURIComponent(this._clientId)}` +\n        `&origin=${encodeURIComponent(window.location.origin)}` +\n        `&state=${encodeURIComponent(state)}` +\n        `&scope=${encodeURIComponent(this._scope)}`\n\n      const features = popupFeatures(this._popupWidth, this._popupHeight)\n      const popup = window.open(url, 'starchild_auth_popup', features)\n\n      if (!popup || popup.closed) {\n        this._pendingLogin = null\n        reject(new Error('Popup was blocked by the browser. Please allow popups for this site.'))\n        return\n      }\n\n      // Poll to detect if user closes the popup without completing login\n      this._popupPollTimer = setInterval(() => {\n        try {\n          if (!popup || popup.closed) {\n            this._clearPopupPoll()\n            if (this._pendingLogin) {\n              const pending = this._pendingLogin\n              this._pendingLogin = null\n              pending.reject(new Error('Login popup was closed before completing sign-in.'))\n            }\n          }\n        } catch {\n          // Cross-origin access error — popup is still open, ignore\n        }\n      }, 500)\n    })\n  }\n\n  /**\n   * Log out: clear tokens, stop refresh timer, revoke refresh token via API.\n   *\n   * @returns Promise that resolves when logout is complete\n   */\n  async logout(): Promise<void> {\n    if (this._destroyed) {\n      return Promise.reject(new Error('StarchildAuth instance has been destroyed'))\n    }\n\n    try {\n      if (this._refreshToken) {\n        await fetch(`${this._apiBase}/oauth/logout`, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({\n            client_id: this._clientId,\n            refresh_token: this._refreshToken,\n          }),\n        })\n      }\n    } catch {\n      // logout API failure should not block local cleanup\n    }\n\n    // Clear local storage\n    localStorage.removeItem(`starchild_rt_${this._clientId}`)\n    this._accessToken = null\n    this._refreshToken = null\n    this._userInfo = null\n    this._containerId = null\n    this._containerIdPromise = null\n    this._stopAutoRefresh()\n\n    this._safeCall(this._onLogout)\n  }\n\n  /**\n   * Verify 2FA code and obtain an action token for sensitive operations.\n   *\n   * The caller is responsible for collecting the 2FA code from the user\n   * (e.g. via a TOTP input dialog). This method sends the code to the\n   * backend and stores the resulting action token internally.\n   *\n   * After successful verification, subsequent API calls that require 2FA\n   * will automatically include the `X-Action-Token` header.\n   *\n   * @param code - TOTP code or backup code from the user\n   * @returns Promise that resolves with the action token\n   */\n  async verify2FA(code: string): Promise<string> {\n    if (this._destroyed) {\n      throw new Error('StarchildAuth instance has been destroyed')\n    }\n    if (!this._accessToken) {\n      throw new Error('Not logged in')\n    }\n\n    const res = await fetch(`${this._apiBase}/2fa/verify-action`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Authorization': `Bearer ${this._accessToken}`,\n      },\n      body: JSON.stringify({ code }),\n    })\n\n    const data = await parseApiResponse<{ actionToken: string }>(res, '/2fa/verify-action')\n    this._actionToken = data.actionToken\n    return data.actionToken\n  }\n\n  /**\n   * Get the current action token (from 2FA verification).\n   * Returns `null` if 2FA has not been verified or the token has expired.\n   */\n  getActionToken(): string | null {\n    return this._actionToken || null\n  }\n\n  /**\n   * Clear the stored action token (e.g. after using it for a sensitive operation).\n   */\n  clearActionToken(): void {\n    this._actionToken = null\n  }\n\n  /**\n   * Get the current access token (JWT, ~15 min lifetime).\n   * Returns `null` if the user is not logged in.\n   */\n  getToken(): string | null {\n    return this._accessToken\n  }\n\n  /**\n   * Get the current OAuth refresh token (long-lived, used only for `/oauth/refresh`).\n   *\n   * Security notes:\n   * - The SDK already persists the refresh token in `localStorage` under\n   *   `starchild_rt_{clientId}` for auto-login — this getter does not increase\n   *   exposure beyond that model; it only makes the in-memory value readable.\n   * - Prefer letting the SDK own refresh (`refreshToken()` / auto-refresh).\n   * - If you copy the value into your own storage, treat it like a password:\n   *   never log it, never send it to third-party backends, never put it in URLs.\n   * - Third-party pages can already read their own localStorage; XSS on the\n   *   integrator origin can steal it either way — mitigate with CSP / no inline scripts.\n   *\n   * @returns Refresh token string, or `null` when logged out / not yet issued\n   */\n  getRefreshToken(): string | null {\n    return this._refreshToken\n  }\n\n  /**\n   * Get the current user info.\n   * Returns `null` if the user is not logged in.\n   */\n  getUserInfo(): UserInfo | null {\n    return this._userInfo\n  }\n\n  /**\n   * Check if the user is currently logged in (has a valid access token).\n   */\n  isLoggedIn(): boolean {\n    return this._accessToken !== null\n  }\n\n  /**\n   * Whether the current user is a guest (temporary) account.\n   * Returns `false` when not logged in.\n   */\n  isGuest(): boolean {\n    return this._userInfo?.isGuest === true\n  }\n\n  /**\n   * Build the main-site URL that opens Account management → Linked accounts.\n   * Third-party apps should send users here to bind a permanent login method\n   * (OAuth / email / phone / wallet) instead of hosting bind UI themselves.\n   */\n  getBindAccountUrl(): string {\n    const base = this._origin.replace(/\\/$/, '')\n    return `${base}/?account_tab=linked-accounts`\n  }\n\n  /**\n   * Open the Starchild main site bind flow in a new tab/window.\n   * Binding is always done on the main site (Linked accounts tab).\n   *\n   * @returns The opened window, or `null` if the browser blocked it\n   */\n  bindAccount(): Window | null {\n    if (this._destroyed) {\n      throw new Error('StarchildAuth instance has been destroyed')\n    }\n    const url = this.getBindAccountUrl()\n    return window.open(url, '_blank', 'noopener,noreferrer')\n  }\n\n  /**\n   * Manually trigger a token refresh via API.\n   *\n   * Normally tokens are refreshed automatically every 12 minutes.\n   * Use this if you need a fresh token immediately.\n   *\n   * @returns Promise resolving with the new access token\n   * @throws If the refresh fails (session expired or no refresh token)\n   */\n  async refreshToken(): Promise<string> {\n    if (this._destroyed) {\n      throw new Error('StarchildAuth instance has been destroyed')\n    }\n\n    if (!this._refreshToken) {\n      throw new Error('No refresh token available. User must login first.')\n    }\n\n    const token = await this._doRefreshApi()\n    return token\n  }\n\n  /**\n   * Destroy the instance: remove event listeners, clear timers, clear tokens.\n   *\n   * After calling `destroy()`, the instance cannot be used again.\n   * Create a new `StarchildAuth` instance if needed.\n   */\n  destroy(): void {\n    this._destroyed = true\n    this._accessToken = null\n    this._refreshToken = null\n    this._userInfo = null\n    this._pendingLogin = null\n\n    window.removeEventListener('message', this._handleMessage)\n    document.removeEventListener('visibilitychange', this._handleVisibility)\n\n    this._stopAutoRefresh()\n    this._clearPopupPoll()\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // API Methods — scope-aware convenience wrappers\n  // Third parties call these instead of raw fetch to each endpoint.\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  private _checkAuth() {\n    if (!this._accessToken) {\n      throw new StarchildAuthError('Not logged in', { status: 401, code: 'NOT_LOGGED_IN' })\n    }\n  }\n  private _authHeaders() {\n    const headers: Record<string, string> = {\n      Authorization: `Bearer ${this._accessToken}`,\n      \"Content-Type\": \"application/json\",\n    }\n    if (this._actionToken) {\n      headers[\"X-Action-Token\"] = this._actionToken\n    }\n    return headers\n  }\n\n  /**\n   * Resolve the caller's container ID for clawd routing.\n   * OAuth access tokens don't carry a containerId, so we look it up via\n   * ai-agent `GET /api/cloud/containers` and cache the first result.\n   * Returns null when unavailable (e.g. no container yet) — clawd requests\n   * then proceed without the header and rely on the backend's own routing.\n   */\n  private async _resolveContainerId(): Promise<string | null> {\n    if (this._containerId) return this._containerId\n    if (this._containerIdPromise) return this._containerIdPromise\n\n    this._containerIdPromise = (async () => {\n      try {\n        const r = await fetch(`${this._chatApiBase}/api/cloud/containers`, {\n          headers: this._authHeaders(),\n        })\n        if (!r.ok) return null\n        const data: unknown = await r.json()\n        const list: Array<{ container_id?: string }> = Array.isArray(data)\n          ? data\n          : ((data as { containers?: Array<{ container_id?: string }> })?.containers ?? [])\n        const cid = list?.[0]?.container_id ?? null\n        if (cid) this._containerId = cid\n        return cid\n      } catch {\n        return null\n      } finally {\n        this._containerIdPromise = null\n      }\n    })()\n\n    return this._containerIdPromise\n  }\n\n  /** Headers for clawd requests — include fly-force-instance-id for routing. */\n  private async _clawdAuthHeaders(): Promise<Record<string, string>> {\n    const headers = this._authHeaders()\n    const cid = await this._resolveContainerId()\n    if (cid) headers['fly-force-instance-id'] = cid\n    return headers\n  }\n\n  private _apiV1(path: string) { return `${this._chatApiBase}${path}` }\n  private _clawdApiV1(path: string) { return `${this._clawdApiBase}${path}` }\n\n  /** JSON API helper — throws {@link StarchildAuthError} on non-2xx. */\n  private async _parse<T>(res: Response, path: string): Promise<T> {\n    return parseApiResponse<T>(res, path)\n  }\n\n  private async _get<T = any>(path: string): Promise<T> {\n    this._checkAuth()\n    const url = this._apiV1(path)\n    const r = await fetch(url, { headers: this._authHeaders() })\n    return this._parse<T>(r, path)\n  }\n  private async _post<T = any>(path: string, body?: any): Promise<T> {\n    this._checkAuth()\n    const r = await fetch(this._apiV1(path), {\n      method: \"POST\",\n      headers: this._authHeaders(),\n      body: body !== undefined ? JSON.stringify(body) : undefined,\n    })\n    return this._parse<T>(r, path)\n  }\n  private async _put<T = any>(path: string, body?: any): Promise<T> {\n    this._checkAuth()\n    const r = await fetch(this._apiV1(path), {\n      method: \"PUT\",\n      headers: this._authHeaders(),\n      body: body !== undefined ? JSON.stringify(body) : undefined,\n    })\n    return this._parse<T>(r, path)\n  }\n  private async _del<T = any>(path: string): Promise<T> {\n    this._checkAuth()\n    const r = await fetch(this._apiV1(path), { method: \"DELETE\", headers: this._authHeaders() })\n    return this._parse<T>(r, path)\n  }\n  // clawd-specific helpers (chat stream, jobs, ws)\n  private async _cget<T = any>(path: string): Promise<T> {\n    this._checkAuth()\n    const r = await fetch(this._clawdApiV1(path), { headers: await this._clawdAuthHeaders() })\n    return this._parse<T>(r, path)\n  }\n  private async _cpost<T = any>(path: string, body?: any): Promise<T> {\n    this._checkAuth()\n    const r = await fetch(this._clawdApiV1(path), {\n      method: \"POST\",\n      headers: await this._clawdAuthHeaders(),\n      body: body !== undefined ? JSON.stringify(body) : undefined,\n    })\n    return this._parse<T>(r, path)\n  }\n  private async _cdel<T = any>(path: string): Promise<T> {\n    this._checkAuth()\n    const r = await fetch(this._clawdApiV1(path), { method: \"DELETE\", headers: await this._clawdAuthHeaders() })\n    return this._parse<T>(r, path)\n  }\n\n  // credit-api helpers (https://credit.iamstarchild.com)\n  private _creditUrl(path: string, query?: Record<string, string | number | undefined | null>): string {\n    const base = this._creditApiBase.replace(/\\/$/, '')\n    const url = new URL(path.startsWith('http') ? path : `${base}${path.startsWith('/') ? path : `/${path}`}`)\n    if (query) {\n      for (const [k, v] of Object.entries(query)) {\n        if (v === undefined || v === null || v === '') continue\n        url.searchParams.set(k, String(v))\n      }\n    }\n    return url.toString()\n  }\n  private async _crget<T = any>(path: string, query?: Record<string, string | number | undefined | null>): Promise<T> {\n    this._checkAuth()\n    const url = this._creditUrl(path, query)\n    const r = await fetch(url, { headers: this._authHeaders() })\n    return this._parse<T>(r, path)\n  }\n  private async _crpost<T = any>(\n    path: string,\n    body?: any,\n    extraHeaders?: Record<string, string>,\n  ): Promise<T> {\n    this._checkAuth()\n    const headers = { ...this._authHeaders(), ...(extraHeaders || {}) }\n    const r = await fetch(this._creditUrl(path), {\n      method: 'POST',\n      headers,\n      body: body !== undefined ? JSON.stringify(body) : undefined,\n    })\n    return this._parse<T>(r, path)\n  }\n\n  // ── profile scope (always available) ──\n  async fetchUserInfo(): Promise<UserInfo | null> { return this._fetchUserInfo() }\n\n  // ── chat scope ──\n\n  /** Options for sending a chat message. */\n  sendMessage(message: string, options?: SendMessageOptions): Promise<Response>\n  /** @deprecated Use sendMessage(message, { threadId }) instead */\n  sendMessage(message: string, threadId?: string): Promise<Response>\n  sendMessage(message: string, optionsOrThreadId?: string | SendMessageOptions): Promise<Response> {\n    this._checkAuth()\n    const opts: SendMessageOptions = typeof optionsOrThreadId === 'string'\n      ? { threadId: optionsOrThreadId }\n      : (optionsOrThreadId || {})\n\n    const body: Record<string, any> = {\n      message,\n      thread_id: opts.threadId,\n    }\n    if (opts.model) body.model = opts.model\n    if (opts.messageId) body.message_id = opts.messageId\n    if (opts.images?.length) {\n      body.images = opts.images.map(img => ({\n        base64_data: img.base64,\n        media_type: img.mediaType,\n      }))\n    }\n    if (opts.files?.length) {\n      body.files = opts.files.map(f => ({\n        name: f.name,\n        workspace_path: f.workspacePath,\n        mime_type: f.mimeType,\n        size: f.size,\n      }))\n    }\n    if (opts.quote) {\n      body.quote = {\n        source_message_id: opts.quote.sourceMessageId,\n        source_thread_id: opts.quote.sourceThreadId,\n        quoted_text: opts.quote.quotedText,\n        source_role: opts.quote.sourceRole,\n      }\n    }\n    return (async () => {\n      const headers = await this._clawdAuthHeaders()\n      return fetch(this._clawdApiV1(\"/chat/stream\"), {\n        method: \"POST\",\n        headers,\n        body: JSON.stringify(body),\n      })\n    })()\n  }\n  reconnectStream(sessionKey: string): Promise<Response> {\n    this._checkAuth()\n    return (async () => {\n      const headers = await this._clawdAuthHeaders()\n      return fetch(this._clawdApiV1(`/chat/stream/reconnect?session_key=${encodeURIComponent(sessionKey)}&channel=web`), { method: \"POST\", headers })\n    })()\n  }\n  async cancelRun(threadId: string): Promise<OkResponse> { return this._cpost<OkResponse>(\"/chat/runs/cancel\", { thread_id: threadId }) }\n  async getModel(threadId: string): Promise<ModelInfo> { return this._cget<ModelInfo>(`/chat/model?thread_id=${encodeURIComponent(threadId)}`) }\n  async setModel(modelId: string, threadId?: string): Promise<OkResponse> { return this._cpost<OkResponse>(\"/chat/model\", { model_id: modelId, thread_id: threadId }) }\n  async getThinkingSummary(threadId: string): Promise<any> { return this._cpost(\"/thinking-summary\", { thread_id: threadId }) }\n\n  // Threads (ai-agent: /api/clawd/threads)\n  async createThread(title?: string): Promise<Thread> {\n    const threadId = crypto.randomUUID?.() ?? `thread_${Date.now()}_${Math.random().toString(36).slice(2,9)}`\n    const userId = this._userInfo?.userInfoId ?? \"\"\n    return this._post<Thread>(\"/api/clawd/threads\", { thread_id: threadId, user_id: userId, title: title || \"\" })\n  }\n  async listThreads(): Promise<ThreadListResponse> { return this._get<ThreadListResponse>(\"/api/clawd/threads\") }\n  async getThread(threadId: string): Promise<Thread> { return this._get<Thread>(`/api/clawd/threads/${threadId}`) }\n  async deleteThread(threadId: string): Promise<OkResponse> { return this._del<OkResponse>(`/api/clawd/threads/${threadId}`) }\n  async searchThreads(query: string): Promise<ThreadSearchResponse> { return this._get<ThreadSearchResponse>(`/api/clawd/threads/search?q=${encodeURIComponent(query)}`) }\n  async pinThread(threadId: string, pinned: boolean): Promise<OkResponse> { return this._post<OkResponse>(`/api/clawd/threads/${threadId}/pin`, { pinned }) }\n  async updateThreadTitle(threadId: string, title: string): Promise<OkResponse> { return this._post<OkResponse>(`/api/clawd/threads/${threadId}/title`, { title }) }\n\n  // Messages (ai-agent: /api/clawd/messages)\n  async listMessages(threadId: string, limit?: number): Promise<MessageListResponse> { return this._get<MessageListResponse>(`/api/clawd/messages?thread_id=${threadId}${limit ? `&limit=${limit}` : \"\"}`) }\n  async deleteMessages(threadId: string): Promise<OkResponse> { return this._del<OkResponse>(`/api/clawd/messages?thread_id=${threadId}`) }\n\n  // Containers (ai-agent: /api/cloud/containers)\n  async listContainers(): Promise<ContainerListResponse> { return this._get<ContainerListResponse>(\"/api/cloud/containers\") }\n  async getContainerStatus(containerId: string): Promise<ContainerStatus> { return this._get<ContainerStatus>(`/api/cloud/containers/status?container_id=${containerId}`) }\n  async getContainerMetrics(containerId: string): Promise<ContainerMetrics> { return this._get<ContainerMetrics>(`/api/cloud/containers/metrics?container_id=${containerId}`) }\n  async deployContainer(): Promise<Container> { return this._post<Container>(\"/api/cloud/containers/deploy\") }\n  async startContainer(containerId: string): Promise<OkResponse> { return this._post<OkResponse>(\"/api/cloud/containers/start\", { container_id: containerId }) }\n  async stopContainer(containerId: string): Promise<OkResponse> { return this._post<OkResponse>(\"/api/cloud/containers/stop\", { container_id: containerId }) }\n  async restartContainer(containerId: string): Promise<OkResponse> { return this._post<OkResponse>(\"/api/cloud/containers/restart\", { container_id: containerId }) }\n  async wakeContainer(containerId: string): Promise<OkResponse> { return this._post<OkResponse>(\"/api/cloud/containers/wake\", { container_id: containerId }) }\n  async renameContainer(containerId: string, name: string): Promise<OkResponse> { return this._put<OkResponse>(\"/api/cloud/containers/rename\", { container_id: containerId, name }) }\n\n  // Skills (ai-agent: /api/skills/catalog)\n  async getSkillsCatalog(): Promise<SkillCatalogResponse> { return this._get<SkillCatalogResponse>(\"/api/skills/catalog\") }\n  async searchSkills(query: string): Promise<SkillCatalogResponse> { return this._get<SkillCatalogResponse>(`/api/skills/catalog/search?q=${encodeURIComponent(query)}`) }\n  async getSkillDetail(source: string, name: string): Promise<SkillDetail> { return this._get<SkillDetail>(`/api/skills/catalog/${source}/${name}`) }\n\n  // Media (ai-agent: /api/clawd/images/upload, /api/audio)\n  async uploadImage(base64: string, mediaType: string): Promise<ImageUploadResponse> { return this._post<ImageUploadResponse>(\"/api/clawd/images/upload\", { base64_data: base64, media_type: mediaType }) }\n  async transcribeAudio(audioBase64: string): Promise<TranscribeResponse> { return this._post<TranscribeResponse>(\"/api/audio/transcribe\", { audio_base64: audioBase64 }) }\n  async synthesizeSpeech(text: string): Promise<SynthesizeResponse> { return this._post<SynthesizeResponse>(\"/v1/synthesize\", { text }) }\n\n  // Shares (ai-agent: /api/clawd/shares)\n  async createShare(threadId: string, messageIds?: string[]): Promise<Share> { return this._post<Share>(\"/api/clawd/shares\", { thread_id: threadId, message_ids: messageIds }) }\n  async listShares(): Promise<ShareListResponse> { return this._get<ShareListResponse>(\"/api/clawd/shares\") }\n  async getShare(shareId: string): Promise<Share> { return this._get<Share>(`/api/clawd/shares/${shareId}`) }\n  async deleteShare(shareId: string): Promise<OkResponse> { return this._del<OkResponse>(`/api/clawd/shares/${shareId}`) }\n  async forkShare(shareId: string): Promise<Share> { return this._post<Share>(`/api/clawd/shares/${shareId}/fork`) }\n\n  // Feedback (ai-agent: /api/clawd/feedback)\n  async rateMessage(messageId: string, type: string, reason?: string): Promise<OkResponse> { return this._put<OkResponse>(\"/api/clawd/feedback\", { message_id: messageId, type, reason }) }\n  async deleteFeedback(messageId: string): Promise<OkResponse> { return this._del<OkResponse>(`/api/clawd/feedback?message_id=${messageId}`) }\n\n  // Jobs (clawd: /scheduled-jobs)\n  async listJobs(): Promise<JobListResponse> { return this._cget<JobListResponse>(\"/scheduled-jobs\") }\n  async createJob(config: any): Promise<Job> { return this._cpost<Job>(\"/scheduled-jobs\", config) }\n\n  // ── chat scope: container advanced operations (delete blocked for OAuth) ──\n  async deleteContainer(containerId: string): Promise<OkResponse> { return this._del<OkResponse>(`/api/cloud/containers?container_id=${containerId}`) }\n  async setComputeConfig(specId: string): Promise<OkResponse> { return this._post<OkResponse>(\"/api/cloud/containers/compute-config\", { spec_id: specId }) }\n  async updateContainer(containerId: string): Promise<OkResponse> { return this._post<OkResponse>(`/api/cloud/containers/${containerId}/update`) }\n  async getFreeQuota(): Promise<FreeQuota> { return this._get<FreeQuota>(\"/v1/free-quota\") }\n\n  // ── chat scope: wallet/portfolio (read) ──\n  async getPortfolio(): Promise<WalletPortfolio> { return this._get<WalletPortfolio>(\"/api/cloud/containers/portfolio/evm\") }\n  async listWallets(): Promise<WalletListResponse> { return this._get<WalletListResponse>(\"/api/cloud/containers/wallets\") }\n\n  // ── chat scope: wallet operations (write) ──\n  async createWallet(): Promise<WalletInfo> { return this._post<WalletInfo>(\"/api/cloud/containers/wallet\") }\n  async deleteWallet(walletAddress: string): Promise<OkResponse> { return this._del<OkResponse>(`/api/cloud/containers/wallet?address=${walletAddress}`) }\n\n  // ── chat scope: wallet export ──\n  async exportPrivateKey(): Promise<{ private_key: string }> { return this._post<{ private_key: string }>(\"/wallet/export\") }\n\n  // ── chat scope: billing (onramp via go-api) ──\n  async createOnrampSession(params: any): Promise<OnrampSession> {\n    this._checkAuth()\n    const path = '/coinbase/onramp-session'\n    const r = await fetch(`${this._apiBase}${path}`, {\n      method: \"POST\",\n      headers: this._authHeaders(),\n      body: JSON.stringify(params),\n    })\n    return parseApiResponse<OnrampSession>(r, path)\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // Credits — starchild-credit-api (scopes: credit:read / credit:write)\n  // Base URL: creditApiBase (default https://credit.iamstarchild.com)\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * GET /api/credits — current credit balance.\n   * Scope: `credit:read` (or `credit:write`).\n   */\n  async getCredits(): Promise<CreditBalance> {\n    return this._crget<CreditBalance>('/api/credits')\n  }\n\n  /**\n   * GET /api/charges — paginated spend history.\n   * Scope: `credit:read`\n   * @param params.page 1-based page\n   * @param params.page_size page size\n   * @param params.start_time ISO 8601 (default last 24h)\n   * @param params.end_time ISO 8601\n   */\n  async getCreditCharges(params?: CreditChargesParams): Promise<CreditChargesResponse> {\n    return this._crget<CreditChargesResponse>('/api/charges', {\n      page: params?.page,\n      page_size: params?.page_size,\n      start_time: params?.start_time,\n      end_time: params?.end_time,\n    })\n  }\n\n  /**\n   * GET /api/topups — paginated top-up history.\n   * Scope: `credit:read`\n   */\n  async getCreditTopups(params?: CreditTopupsParams): Promise<CreditTopupsResponse> {\n    return this._crget<CreditTopupsResponse>('/api/topups', {\n      page: params?.page,\n      page_size: params?.page_size,\n    })\n  }\n\n  /**\n   * GET /api/usage/daily — daily usage breakdown.\n   * Scope: `credit:read`\n   * @param params.days rolling window in days\n   */\n  async getCreditDailyUsage(params?: CreditDailyUsageParams): Promise<CreditDailyUsageResponse> {\n    return this._crget<CreditDailyUsageResponse>('/api/usage/daily', {\n      days: params?.days,\n    })\n  }\n\n  /**\n   * GET /api/pending — credits waiting to land on a machine.\n   * Scope: `credit:read`\n   */\n  async getPendingCredit(): Promise<PendingCreditResponse> {\n    return this._crget<PendingCreditResponse>('/api/pending')\n  }\n\n  /**\n   * GET /api/tx/{txHash} — poll top-up / chain tx status.\n   * Scope: `credit:read`\n   *\n   * Poll until `credited === true`, or `pending === true` with empty container_id\n   * (stored as pending_credit), or an error_message is set.\n   */\n  async getCreditTxStatus(txHash: string): Promise<CreditTxStatus> {\n    return this._crget<CreditTxStatus>(`/api/tx/${encodeURIComponent(txHash)}`)\n  }\n\n  /**\n   * POST /api/stripe/create-session — create Stripe Checkout for credit purchase.\n   * Scope: `credit:write`\n   * @returns `{ url }` — redirect the user to complete payment\n   */\n  async createStripeSession(params: StripeCreateSessionRequest): Promise<StripeCreateSessionResponse> {\n    return this._crpost<StripeCreateSessionResponse>('/api/stripe/create-session', params)\n  }\n\n  /**\n   * POST /api/gift-cards/redeem — redeem a gift card code for credits.\n   * Scope: `credit:write`\n   */\n  async redeemGiftCard(params: RedeemGiftCardRequest | string): Promise<RedeemGiftCardResponse> {\n    const body: RedeemGiftCardRequest = typeof params === 'string' ? { code: params } : params\n    return this._crpost<RedeemGiftCardResponse>('/api/gift-cards/redeem', body)\n  }\n\n  /**\n   * GET /api/points/balance — points available to exchange for credits.\n   * Scope: `credit:read`\n   */\n  async getPointsExchangeBalance(): Promise<PointsExchangeBalance> {\n    return this._crget<PointsExchangeBalance>('/api/points/balance')\n  }\n\n  /**\n   * POST /api/points/exchange — convert points into credits.\n   * Scope: `credit:write`\n   * @param params.points points to spend\n   * @param idempotencyKey optional Idempotency-Key header (recommended for retries)\n   */\n  async exchangePoints(\n    params: PointsExchangeRequest | number,\n    idempotencyKey?: string,\n  ): Promise<PointsExchangeResponse> {\n    const body: PointsExchangeRequest = typeof params === 'number' ? { points: params } : params\n    const extra = idempotencyKey ? { 'Idempotency-Key': idempotencyKey } : undefined\n    return this._crpost<PointsExchangeResponse>('/api/points/exchange', body, extra)\n  }\n\n  /**\n   * GET /api/kyc/status — whether KYC is required / completed for points exchange.\n   * Scope: `credit:read`\n   */\n  async getKycStatus(): Promise<KycStatus> {\n    return this._crget<KycStatus>('/api/kyc/status')\n  }\n\n  /**\n   * POST /api/kyc/setup-intent — create Stripe SetupIntent for card KYC.\n   * Scope: `credit:write`\n   * Use `client_secret` with Stripe.js / Payment Element, then call `verifyKyc`.\n   */\n  async createKycSetupIntent(): Promise<KycSetupIntentResponse> {\n    return this._crpost<KycSetupIntentResponse>('/api/kyc/setup-intent')\n  }\n\n  /**\n   * POST /api/kyc/verify — finalize KYC after SetupIntent succeeds.\n   * Scope: `credit:write`\n   */\n  async verifyKyc(params: KycVerifyRequest | string): Promise<KycVerifyResponse> {\n    const body: KycVerifyRequest = typeof params === 'string' ? { setup_intent_id: params } : params\n    return this._crpost<KycVerifyResponse>('/api/kyc/verify', body)\n  }\n\n  /**\n   * GET /api/referral/status — referral code / bind state.\n   * Scope: `credit:read`\n   */\n  async getReferralStatus(): Promise<ReferralStatus> {\n    return this._crget<ReferralStatus>('/api/referral/status')\n  }\n\n  /**\n   * POST /api/referral/bind — bind an inviter code (one-time).\n   * Scope: `credit:write`\n   */\n  async bindReferralCode(params: ReferralBindRequest | string): Promise<ReferralBindResponse> {\n    const body: ReferralBindRequest = typeof params === 'string' ? { referral_code: params } : params\n    return this._crpost<ReferralBindResponse>('/api/referral/bind', body)\n  }\n\n  /**\n   * GET /api/referral/invitees — list of users invited by the current user.\n   * Scope: `credit:read`\n   */\n  async getReferralInvitees(): Promise<ReferralInviteesResponse> {\n    return this._crget<ReferralInviteesResponse>('/api/referral/invitees')\n  }\n\n  /**\n   * GET /api/migration/reward/status — eligibility for migration reward.\n   * Scope: `credit:read`\n   */\n  async getMigrationRewardStatus(): Promise<MigrationRewardStatus> {\n    return this._crget<MigrationRewardStatus>('/api/migration/reward/status')\n  }\n\n  /**\n   * POST /api/migration/reward/claim — claim migration reward credits.\n   * Scope: `credit:write`\n   */\n  async claimMigrationReward(): Promise<MigrationRewardClaimResponse> {\n    return this._crpost<MigrationRewardClaimResponse>('/api/migration/reward/claim')\n  }\n\n  /**\n   * GET /api/public/users/{userId}/woo-bonus — WOO staking bonus percent (public).\n   * No OAuth scope required; still sends Bearer token when logged in.\n   */\n  async getWooBonus(userId?: string): Promise<WooBonusResponse> {\n    const id = userId ?? this._userInfo?.userInfoId\n    if (!id) throw new Error('userId is required (pass explicitly or login first)')\n    // Public endpoint — allow unauthenticated call when no token\n    if (!this._accessToken) {\n      const path = `/api/public/users/${encodeURIComponent(id)}/woo-bonus`\n      const r = await fetch(this._creditUrl(path))\n      return parseApiResponse<WooBonusResponse>(r, path)\n    }\n    return this._crget<WooBonusResponse>(`/api/public/users/${encodeURIComponent(id)}/woo-bonus`)\n  }\n\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // Namespaced API (plan 303) — flat methods above remain fully supported\n  // Example: await auth.chat.send('hi'); await auth.credit.getBalance()\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /** profile scope helpers */\n  get profile() {\n    return {\n      fetchUserInfo: this.fetchUserInfo.bind(this),\n      getUserInfo: this.getUserInfo.bind(this),\n      isGuest: this.isGuest.bind(this),\n      getBindAccountUrl: this.getBindAccountUrl.bind(this),\n      bindAccount: this.bindAccount.bind(this),\n    }\n  }\n\n  /** chat / agent runtime (SSE, model, cancel) */\n  get chat() {\n    return {\n      send: this.sendMessage.bind(this),\n      sendMessage: this.sendMessage.bind(this),\n      reconnect: this.reconnectStream.bind(this),\n      reconnectStream: this.reconnectStream.bind(this),\n      cancelRun: this.cancelRun.bind(this),\n      getModel: this.getModel.bind(this),\n      setModel: this.setModel.bind(this),\n      getThinkingSummary: this.getThinkingSummary.bind(this),\n      createSyncWebSocket: this.createSyncWebSocket.bind(this),\n      createTerminalWebSocket: this.createTerminalWebSocket.bind(this),\n      createMetricsWebSocket: this.createMetricsWebSocket.bind(this),\n    }\n  }\n\n  /** conversation threads */\n  get threads() {\n    return {\n      create: this.createThread.bind(this),\n      list: this.listThreads.bind(this),\n      get: this.getThread.bind(this),\n      delete: this.deleteThread.bind(this),\n      search: this.searchThreads.bind(this),\n      pin: this.pinThread.bind(this),\n      updateTitle: this.updateThreadTitle.bind(this),\n    }\n  }\n\n  /** thread messages */\n  get messages() {\n    return {\n      list: this.listMessages.bind(this),\n      delete: this.deleteMessages.bind(this),\n    }\n  }\n\n  /** cloud containers */\n  get containers() {\n    return {\n      list: this.listContainers.bind(this),\n      status: this.getContainerStatus.bind(this),\n      metrics: this.getContainerMetrics.bind(this),\n      deploy: this.deployContainer.bind(this),\n      start: this.startContainer.bind(this),\n      stop: this.stopContainer.bind(this),\n      restart: this.restartContainer.bind(this),\n      wake: this.wakeContainer.bind(this),\n      rename: this.renameContainer.bind(this),\n      delete: this.deleteContainer.bind(this),\n      setComputeConfig: this.setComputeConfig.bind(this),\n      update: this.updateContainer.bind(this),\n      getFreeQuota: this.getFreeQuota.bind(this),\n    }\n  }\n\n  /** skills catalog */\n  get skills() {\n    return {\n      catalog: this.getSkillsCatalog.bind(this),\n      search: this.searchSkills.bind(this),\n      detail: this.getSkillDetail.bind(this),\n    }\n  }\n\n  /** media helpers */\n  get media() {\n    return {\n      uploadImage: this.uploadImage.bind(this),\n      transcribeAudio: this.transcribeAudio.bind(this),\n      synthesizeSpeech: this.synthesizeSpeech.bind(this),\n    }\n  }\n\n  /** shares */\n  get shares() {\n    return {\n      create: this.createShare.bind(this),\n      list: this.listShares.bind(this),\n      get: this.getShare.bind(this),\n      delete: this.deleteShare.bind(this),\n      fork: this.forkShare.bind(this),\n    }\n  }\n\n  /** message feedback */\n  get feedback() {\n    return {\n      rate: this.rateMessage.bind(this),\n      delete: this.deleteFeedback.bind(this),\n    }\n  }\n\n  /** scheduled jobs */\n  get jobs() {\n    return {\n      list: this.listJobs.bind(this),\n      create: this.createJob.bind(this),\n      get: this.getJob.bind(this),\n      pause: this.pauseJob.bind(this),\n      resume: this.resumeJob.bind(this),\n      restart: this.restartJob.bind(this),\n    }\n  }\n\n  /** wallet / portfolio (chat-scoped today) */\n  get wallet() {\n    return {\n      getPortfolio: this.getPortfolio.bind(this),\n      list: this.listWallets.bind(this),\n      create: this.createWallet.bind(this),\n      delete: this.deleteWallet.bind(this),\n      exportPrivateKey: this.exportPrivateKey.bind(this),\n      createOnrampSession: this.createOnrampSession.bind(this),\n    }\n  }\n\n  /**\n   * Credits API namespace (`credit:read` / `credit:write`).\n   * Points exchange, KYC, and referral are OAuth-open under these scopes.\n   */\n  get credit() {\n    return {\n      getBalance: this.getCredits.bind(this),\n      getCredits: this.getCredits.bind(this),\n      getCharges: this.getCreditCharges.bind(this),\n      getTopups: this.getCreditTopups.bind(this),\n      getDailyUsage: this.getCreditDailyUsage.bind(this),\n      getPending: this.getPendingCredit.bind(this),\n      getTxStatus: this.getCreditTxStatus.bind(this),\n      createStripeSession: this.createStripeSession.bind(this),\n      redeemGiftCard: this.redeemGiftCard.bind(this),\n      getPointsBalance: this.getPointsExchangeBalance.bind(this),\n      exchangePoints: this.exchangePoints.bind(this),\n      getKycStatus: this.getKycStatus.bind(this),\n      createKycSetupIntent: this.createKycSetupIntent.bind(this),\n      verifyKyc: this.verifyKyc.bind(this),\n      getReferralStatus: this.getReferralStatus.bind(this),\n      bindReferralCode: this.bindReferralCode.bind(this),\n      getReferralInvitees: this.getReferralInvitees.bind(this),\n      getMigrationRewardStatus: this.getMigrationRewardStatus.bind(this),\n      claimMigrationReward: this.claimMigrationReward.bind(this),\n      getWooBonus: this.getWooBonus.bind(this),\n    }\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // WebSocket connections — chat scope\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /** WebSocket origin — web `workspaceDomain.wsDomain` (default wss://preview.iamstarchild.com). */\n  private _wsBaseUrl(): string {\n    return this._clawdWsBase\n  }\n\n  /**\n   * Create a file-sync WebSocket connection.\n   * Passes JWT token + userId as query params (mirrors the frontend pattern).\n   *\n   * Message types received:\n   * - sync:connected — connection established\n   * - file:created / file:updated / file:deleted / file:moved\n   *\n   * @example\n   * const ws = auth.createSyncWebSocket()\n   * ws.onmessage = (e) => {\n   *   const msg = JSON.parse(e.data)\n   *   if (msg.type === 'file:updated') reloadFile(msg.payload.path)\n   * }\n   */\n  createSyncWebSocket(): WebSocket {\n    this._checkAuth()\n    // web: workspaceDomain.wsDomain + /ws/sync?user_id&token\n    const url = new URL(`${this._wsBaseUrl()}/ws/sync`)\n    const userId = this._userInfo?.userInfoId\n    if (userId) url.searchParams.set('user_id', userId)\n    if (this._accessToken) url.searchParams.set('token', this._accessToken)\n    return new WebSocket(url.toString())\n  }\n\n  /**\n   * Create a terminal WebSocket connection.\n   * sessionId is provided by the SSE chat stream (terminal:connected event).\n   *\n   * Message types received:\n   * - connected — session established, carries sessionId\n   * - output — terminal output data\n   * - pong — heartbeat response\n   * - error — terminal error\n   *\n   * @example\n   * const ws = auth.createTerminalWebSocket('term_abc123')\n   * ws.onmessage = (e) => {\n   *   const msg = JSON.parse(e.data)\n   *   if (msg.type === 'output') console.write(msg.data)\n   * }\n   */\n  createTerminalWebSocket(sessionId: string): WebSocket {\n    this._checkAuth()\n    const url = new URL(`${this._wsBaseUrl()}/ws/terminal/${sessionId}`)\n    return new WebSocket(url.toString())\n  }\n\n  /**\n   * Create a metrics WebSocket connection.\n   * Receives real-time container resource metrics (CPU, memory, disk).\n   *\n   * @example\n   * const ws = auth.createMetricsWebSocket()\n   * ws.onmessage = (e) => {\n   *   const metrics = JSON.parse(e.data)\n   *   console.log('CPU %:', metrics.cpu_percent)\n   * }\n   */\n  createMetricsWebSocket(): WebSocket {\n    this._checkAuth()\n    const url = new URL(`${this._wsBaseUrl()}/ws/metrics`)\n    if (this._accessToken) url.searchParams.set('token', this._accessToken)\n    return new WebSocket(url.toString())\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // Internal — message handling\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /** Handle incoming postMessage events from Starchild pages. */\n  private _onMessage(event: MessageEvent): void {\n    // Security: only accept messages from the configured Starchild origin\n    if (event.origin !== this._origin) return\n\n    const data = event.data as StarchildMessage | undefined\n    if (!data || typeof data.type !== 'string') return\n\n    switch (data.type) {\n      case 'starchild_auth_success':\n        this._handleAuthSuccess(data)\n        break\n      case 'starchild_auth_error':\n        this._handleAuthError(data.error, data.message)\n        break\n      case 'starchild_auth_cancelled':\n        this._handleAuthCancelled()\n        break\n    }\n  }\n\n  /** Handle successful login from the popup. */\n  private _handleAuthSuccess(data: AuthSuccessMessage): void {\n    // Validate state to prevent CSRF\n    if (this._pendingLogin && data.state !== this._pendingLogin.state) {\n      return // State mismatch — ignore (possible CSRF attempt)\n    }\n\n    this._accessToken = data.accessToken\n    this._refreshToken = data.refreshToken\n    this._userInfo = data.userInfo ?? null\n    // Reset cached containerId — may differ for the newly signed-in user\n    this._containerId = null\n    this._containerIdPromise = null\n\n    // Persist refreshToken to localStorage for session restoration\n    localStorage.setItem(`starchild_rt_${this._clientId}`, data.refreshToken)\n\n    this._clearPopupPoll()\n    this._startAutoRefresh()\n\n    const result: LoginResult = {\n      accessToken: this._accessToken,\n      refreshToken: this._refreshToken,\n      expiresIn: data.expiresIn,\n      userInfo: this._userInfo!,\n    }\n\n    // Resolve the login promise\n    if (this._pendingLogin) {\n      const pending = this._pendingLogin\n      this._pendingLogin = null\n      pending.resolve(result)\n    }\n\n    // Fire callback\n    this._safeCall(this._onLogin, result)\n  }\n\n  /** Handle auth error from the popup. */\n  private _handleAuthError(error: string, message: string): void {\n    this._clearPopupPoll()\n\n    if (this._pendingLogin) {\n      const pending = this._pendingLogin\n      this._pendingLogin = null\n      pending.reject(new Error(`Auth error [${error}]: ${message}`))\n    }\n  }\n\n  /** Handle auth cancelled (user closed popup via cancel button). */\n  private _handleAuthCancelled(): void {\n    this._clearPopupPoll()\n\n    if (this._pendingLogin) {\n      const pending = this._pendingLogin\n      this._pendingLogin = null\n      pending.reject(new Error('Login was cancelled by the user.'))\n    }\n  }\n\n  /** Handle token refresh failure. */\n  private _handleTokenRefreshFailed(): void {\n    // Stop auto-refresh — user needs to login again\n    this._stopAutoRefresh()\n\n    // Clear stored refresh token since it's no longer valid\n    localStorage.removeItem(`starchild_rt_${this._clientId}`)\n    this._refreshToken = null\n\n    // Fire callback\n    this._safeCall(this._onTokenRefreshFailed)\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // Internal — refresh & timers\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /** Try to restore session from stored refreshToken in localStorage. */\n  private _tryAutoLogin(): void {\n    const stored = localStorage.getItem(`starchild_rt_${this._clientId}`)\n    if (stored) {\n      this._refreshToken = stored\n      this._doRefresh()\n    }\n  }\n\n  /** Perform a token refresh via API (fire-and-forget for auto-refresh). */\n  private async _doRefresh(): Promise<void> {\n    if (this._destroyed || !this._refreshToken) return\n\n    try {\n      await this._doRefreshApi()\n    } catch {\n      this._handleTokenRefreshFailed()\n    }\n  }\n\n  /**\n   * Call the refresh API and return the new access token.\n   * Throws on failure.\n   */\n  private async _doRefreshApi(): Promise<string> {\n    const resp = await fetch(`${this._apiBase}/oauth/refresh`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        client_id: this._clientId,\n        refresh_token: this._refreshToken,\n      }),\n    })\n\n    if (!resp.ok) {\n      throw new Error('Token refresh failed')\n    }\n\n    const data = await resp.json()\n    this._accessToken = data.access_token\n\n    // Start auto-refresh if not already running\n    if (!this._refreshTimer) {\n      this._startAutoRefresh()\n    }\n\n    // Fire token refresh callback\n    this._safeCall(this._onTokenRefresh, data.access_token)\n\n    // Fetch user info using the new access token\n    const userInfo = await this._fetchUserInfo()\n    if (userInfo) {\n      this._userInfo = userInfo\n      // Fire onLogin so the UI can update with user info\n      this._safeCall(this._onLogin, {\n        accessToken: this._accessToken!,\n        refreshToken: this._refreshToken!,\n        expiresIn: data.expires_in ?? 0,\n        userInfo: this._userInfo,\n      })\n    }\n\n    return data.access_token\n  }\n\n  /**\n   * Fetch user info from /oauth/userinfo using the current access token.\n   */\n  private async _fetchUserInfo(): Promise<UserInfo | null> {\n    if (!this._accessToken) return null\n    try {\n      const resp = await fetch(`${this._chatApiBase}/v1/oauth/userinfo`, {\n        method: 'GET',\n        headers: {\n          Authorization: `Bearer ${this._accessToken}`,\n        },\n      })\n      if (!resp.ok) return null\n      const data = await resp.json()\n      return {\n        userInfoId: data.userInfoId ?? data.user_info_id ?? '',\n        agentName: data.agentName ?? data.agent_name ?? data.user_name ?? '',\n        agentAvatar: data.agentAvatar ?? data.agent_avatar ?? data.avatar ?? '',\n        isGuest: data.isGuest ?? false,\n      }\n    } catch {\n      return null\n    }\n  }\n\n  /** Start the periodic auto-refresh timer. */\n  private _startAutoRefresh(): void {\n    this._stopAutoRefresh()\n    this._refreshTimer = setInterval(() => {\n      this._doRefresh()\n    }, this._refreshInterval)\n  }\n\n  /** Stop the periodic auto-refresh timer. */\n  private _stopAutoRefresh(): void {\n    if (this._refreshTimer) {\n      clearInterval(this._refreshTimer)\n      this._refreshTimer = null\n    }\n  }\n\n  /** Clear the popup close-detection poll timer. */\n  private _clearPopupPoll(): void {\n    if (this._popupPollTimer) {\n      clearInterval(this._popupPollTimer)\n      this._popupPollTimer = null\n    }\n  }\n\n  /** Handle visibility change: refresh token when page comes back from background. */\n  private _onVisibilityChange(): void {\n    if (document.visibilityState === 'visible' && this._accessToken && !this._destroyed) {\n      this._doRefresh()\n    }\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // Internal — helpers\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /** Safely call a callback, catching and logging any errors. */\n  private _safeCall<T extends unknown[]>(fn: ((...args: T) => void) | null, ...args: T): void {\n    if (!fn) return\n    try {\n      fn(...args)\n    } catch (e) {\n      console.error('[StarchildAuth] Callback error:', e)\n    }\n  }\n  // ═══════════════════════════════════════════════════════════════════════════\n  // Additional convenience methods\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  // Threads — user messages & metadata\n  async getUserMessages(threadId: string, limit?: number): Promise<MessageListResponse> { return this._get<MessageListResponse>(`/api/clawd/threads/${threadId}/user-messages?limit=${limit ?? 50}`) }\n  async mergeThreadMetadata(threadId: string, metadata: Record<string, any>): Promise<OkResponse> { return this._put<OkResponse>(`/api/clawd/threads/${threadId}/metadata`, { metadata }) }\n\n  // Scheduled jobs — clawd\n  async getJob(jobId: string): Promise<Job> { return this._cget<Job>(`/scheduled-jobs/${jobId}`) }\n  async pauseJob(jobId: string): Promise<OkResponse> { return this._cpost<OkResponse>(`/scheduled-jobs/${jobId}/pause`) }\n  async resumeJob(jobId: string): Promise<OkResponse> { return this._cpost<OkResponse>(`/scheduled-jobs/${jobId}/resume`) }\n  async restartJob(jobId: string): Promise<OkResponse> { return this._cpost<OkResponse>(`/scheduled-jobs/${jobId}/restart`) }\n  async deleteJob(jobId: string): Promise<OkResponse> { return this._cdel<OkResponse>(`/scheduled-jobs/${jobId}`) }\n  async dequeueMessage(threadId: string, messageId: string): Promise<OkResponse> { return this._cpost<OkResponse>(`/chat/runs/dequeue?thread_id=${threadId}&message_id=${messageId}`) }\n\n  // Forums & social (already included in chat via container JWT)\n  async getNotifications(): Promise<any> { return this._get(\"/v1/agentx/notifications\") }\n  async getUnreadNotificationCount(): Promise<{ count: number }> { return this._get<{ count: number }>(\"/v1/agentx/notifications/unread-count\") }\n  async markNotificationsRead(): Promise<OkResponse> { return this._post<OkResponse>(\"/v1/agentx/notifications/mark-read\") }\n\n  // Points & quests (included in chat via container JWT)\n  async getPointBalance(): Promise<{ balance: number }> { return this._get<{ balance: number }>(\"/v1/points/balance\") }\n  async getPointTransactions(limit?: number): Promise<any> { return this._get(`/v1/points/transactions${limit ? `?limit=${limit}` : ''}`) }\n  async getPointsLeaderboard(): Promise<any> { return this._get(\"/v1/points/leaderboard\") }\n  async getQuests(): Promise<any> { return this._get(\"/v1/quests/daily\") }\n  async getAchievements(): Promise<any> { return this._get(\"/v1/quests/achievements\") }\n  async checkin(): Promise<OkResponse> { return this._post<OkResponse>(\"/v1/quests/checkin\") }\n  async claimQuest(questKey: string): Promise<OkResponse> { return this._post<OkResponse>(\"/v1/quests/claim\", { quest_key: questKey }) }\n\n  // Agent profile (included in chat via container JWT)\n  async getAgentProfile(): Promise<any> { return this._get(\"/v1/agent/profile\") }\n  async updateAgentProfile(fields: Record<string, any>): Promise<OkResponse> { return this._put<OkResponse>(\"/v1/agent/profile\", fields) }\n  async getAgentSettings(): Promise<any> { return this._get(\"/v1/agent/settings\") }\n  async updateAgentSettings(settings: Record<string, any>): Promise<OkResponse> { return this._put<OkResponse>(\"/v1/agent/settings\", settings) }\n\n  // Models\n  async listModels(): Promise<ModelInfo[]> { return this._cget<ModelInfo[]>(\"/chat/models\") }\n\n  // Container wallet policy\n  async getWalletPolicy(): Promise<any> { return this._get(\"/api/cloud/containers/wallet/policy\") }\n  async setWalletPolicy(policy: any): Promise<OkResponse> { return this._put<OkResponse>(\"/api/cloud/containers/wallet/policy\", policy) }\n  async getSvmPortfolio(): Promise<any> { return this._get(\"/api/cloud/containers/portfolio/svm\") }\n  async getTrialStatus(): Promise<any> { return this._get(\"/v1/trial/status\") }\n  async getComputeSpecs(): Promise<ComputeSpec[]> { return this._get<ComputeSpec[]>(\"/v1/compute/specs\") }\n}\n"],"names":["generateNonce","arr","b","popupFeatures","width","height","left","top","StarchildAuthError","message","options","res","body","path","parsed","normalizeErrorBody","insufficientScope","looksLikeInsufficientScope","stringifyDetail","value","v","detail","o","code","item","d","parseApiResponse","text","data","DEFAULT_ORIGIN","DEFAULT_API_BASE","DEFAULT_CHAT_API_BASE","DEFAULT_CLAWD_API_BASE","DEFAULT_CLAWD_WS_BASE","DEFAULT_CREDIT_API_BASE","DEFAULT_POPUP_WIDTH","DEFAULT_POPUP_HEIGHT","DEFAULT_REFRESH_INTERVAL","StarchildAuth","resolve","reject","state","url","features","popup","pending","_a","headers","r","list","cid","query","base","k","extraHeaders","optionsOrThreadId","opts","img","_b","f","sessionKey","threadId","modelId","title","userId","pinned","limit","containerId","name","source","base64","mediaType","audioBase64","messageIds","shareId","messageId","type","reason","config","specId","walletAddress","params","txHash","idempotencyKey","extra","id","sessionId","event","result","error","stored","resp","userInfo","fn","args","e","metadata","jobId","questKey","fields","settings","policy"],"mappings":"sOAIO,SAASA,GAAwB,CACtC,GAAI,CACF,MAAMC,EAAM,IAAI,WAAW,EAAE,EAC7B,cAAO,gBAAgBA,CAAG,EACnB,MAAM,KAAKA,EAAMC,GAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CACxE,MAAQ,CACN,OAAO,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,EAAI,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CACjF,CACF,CAKO,SAASC,EAAcC,EAAeC,EAAwB,CACnE,MAAMC,EAAO,KAAK,IAAI,EAAG,KAAK,OAAO,OAAO,MAAQF,GAAS,CAAC,CAAC,EACzDG,EAAM,KAAK,IAAI,EAAG,KAAK,OAAO,OAAO,OAASF,GAAU,CAAC,CAAC,EAChE,MAAO,CACL,SAASD,CAAK,GACd,UAAUC,CAAM,GAChB,QAAQC,CAAI,GACZ,OAAOC,CAAG,GACV,iBACA,gBACA,YACA,aACA,aACA,aAAA,EACA,KAAK,GAAG,CACZ,CC1BO,MAAMC,UAA2B,KAAM,CAc5C,YACEC,EACAC,EAQI,GACJ,CAUA,GATA,MAAMD,CAAO,EACb,KAAK,KAAO,qBACZ,KAAK,OAASC,EAAQ,QAAU,EAChC,KAAK,KAAOA,EAAQ,KACpB,KAAK,OAASA,EAAQ,OACtB,KAAK,KAAOA,EAAQ,KACpB,KAAK,kBAAoBA,EAAQ,mBAAqB,GACtD,KAAK,SAAWA,EAAQ,SAEpBA,EAAQ,QAAU,OACpB,GAAI,CACA,KAAqC,MAAQA,EAAQ,KACzD,MAAQ,CAER,CAEJ,CAEA,OAAO,aAAaC,EAAeC,EAAeC,EAAmC,CACnF,MAAMC,EAASC,EAAmBH,CAAI,EAChCI,EACJL,EAAI,SAAW,MACdM,EAA2BH,EAAO,OAAO,GACxCG,EAA2BH,EAAO,IAAI,GACtCG,EAA2BC,EAAgBJ,EAAO,MAAM,CAAC,GAE7D,OAAO,IAAIN,EAAmBM,EAAO,SAAW,mBAAmBH,EAAI,MAAM,IAAK,CAChF,OAAQA,EAAI,OACZ,KAAMG,EAAO,KACb,OAAQA,EAAO,QAAUF,EACzB,KAAAC,EACA,kBAAAG,EACA,SAAUL,CAAA,CACX,CACH,CACF,CAEA,SAASM,EAA2BE,EAAgC,CAClE,GAAI,CAACA,EAAO,MAAO,GACnB,MAAMC,EAAID,EAAM,YAAA,EAChB,OACEC,EAAE,SAAS,oBAAoB,GAC/BA,EAAE,SAAS,oBAAoB,GAC/BA,EAAE,SAAS,aAAa,GACxBA,EAAE,SAAS,cAAc,GACxBA,EAAE,SAAS,OAAO,IAAMA,EAAE,SAAS,UAAU,GAAKA,EAAE,SAAS,SAAS,EAE3E,CAEA,SAASF,EAAgBG,EAAyB,CAChD,GAAIA,GAAU,KAAM,MAAO,GAC3B,GAAI,OAAOA,GAAW,SAAU,OAAOA,EACvC,GAAI,CACF,OAAO,KAAK,UAAUA,CAAM,CAC9B,MAAQ,CACN,OAAO,OAAOA,CAAM,CACtB,CACF,CAEA,SAASN,EAAmBH,EAAqE,CAC/F,GAAIA,GAAQ,MAAQA,IAAS,GAC3B,MAAO,CAAE,QAAS,gBAAA,EAEpB,GAAI,OAAOA,GAAS,SAClB,MAAO,CAAE,QAASA,EAAM,OAAQA,CAAA,EAElC,GAAI,OAAOA,GAAS,SAClB,MAAO,CAAE,QAAS,OAAOA,CAAI,EAAG,OAAQA,CAAA,EAG1C,MAAMU,EAAIV,EACJS,EAASC,EAAE,QAAUA,EAAE,OAASA,EAAE,SAAWA,EAAE,IACrD,IAAIb,EAAU,GACVc,EAMJ,GAJI,OAAOD,EAAE,MAAS,WAAiBA,EAAE,KAChC,OAAOA,EAAE,YAAe,WAAiBA,EAAE,WAC3C,OAAOA,EAAE,OAAU,UAAYA,EAAE,QAAUA,EAAE,MAAM,YAAA,IAAeC,EAAOD,EAAE,OAEhF,OAAOD,GAAW,SACpBZ,EAAUY,UACD,MAAM,QAAQA,CAAM,EAE7BZ,EAAUY,EACP,IAAKG,GACAA,GAAQ,OAAOA,GAAS,UAAY,QAAUA,EACzC,OAAQA,EAA0B,GAAG,EAEvCN,EAAgBM,CAAI,CAC5B,EACA,OAAO,OAAO,EACd,KAAK,IAAI,UACHH,GAAU,OAAOA,GAAW,SAAU,CAC/C,MAAMI,EAAIJ,EACN,OAAOI,EAAE,SAAY,WAAoBA,EAAE,QACtC,OAAOA,EAAE,OAAU,WAAoBA,EAAE,MAC7ChB,EAAUS,EAAgBG,CAAM,EACjC,OAAOI,EAAE,MAAS,WAAUF,EAAOA,GAAQE,EAAE,KACnD,CAEA,MAAI,CAAChB,GAAW,OAAOa,EAAE,SAAY,aAAoBA,EAAE,SACvD,CAACb,GAAW,OAAOa,EAAE,OAAU,aAAoBA,EAAE,OACpDb,IAASA,EAAU,kBAEjB,CAAE,QAAAA,EAAS,KAAAc,EAAM,OAAQF,GAAUT,CAAA,CAC5C,CAKA,eAAsBc,EAAoBf,EAAeE,EAA2B,CAClF,MAAMc,EAAO,MAAMhB,EAAI,KAAA,EACvB,IAAIiB,EAAgB,KACpB,GAAID,EACF,GAAI,CACFC,EAAO,KAAK,MAAMD,CAAI,CACxB,MAAQ,CACNC,EAAOD,CACT,CAEF,GAAI,CAAChB,EAAI,GACP,MAAMH,EAAmB,aAAaG,EAAKiB,EAAMf,CAAI,EAEvD,OAAOe,CACT,CC3FA,MAAMC,EAAiB,2BACjBC,EAAmB,qCACnBC,EAAwB,kCAExBC,EAAyB,mCAEzBC,EAAwB,iCACxBC,EAA0B,kCAC1BC,EAAsB,IACtBC,EAAuB,IACvBC,EAA2B,IAAU,IAoCpC,MAAMC,CAAc,CA6CzB,YAAY5B,EAA+B,CACzC,GAzBF,KAAQ,aAA8B,KACtC,KAAQ,cAA+B,KACvC,KAAQ,UAA6B,KACrC,KAAQ,aAA8B,KACtC,KAAQ,WAAa,GAMrB,KAAQ,aAA8B,KACtC,KAAQ,oBAAqD,KAG7D,KAAQ,cAAqC,KAG7C,KAAQ,cAAuD,KAC/D,KAAQ,gBAAyD,KAO3D,EAACA,GAAA,MAAAA,EAAS,UACZ,MAAM,IAAI,MAAM,uFAAuF,EAGzG,KAAK,UAAYA,EAAQ,SACzB,KAAK,OAASA,EAAQ,OAAS,UAC/B,KAAK,QAAUA,EAAQ,QAAUmB,EACjC,KAAK,SAAWnB,EAAQ,SAAWoB,EACnC,KAAK,aAAepB,EAAQ,aAAeqB,EAE3C,KAAK,cAAgBrB,EAAQ,cAAgBsB,EAEzCtB,EAAQ,YACV,KAAK,aAAeA,EAAQ,YAAY,QAAQ,MAAO,EAAE,EAChDA,EAAQ,aACjB,KAAK,aAAeA,EAAQ,aACzB,QAAQ,MAAO,EAAE,EACjB,QAAQ,WAAY,MAAM,EAC1B,QAAQ,UAAW,KAAK,EAE3B,KAAK,aAAeuB,EAEtB,KAAK,eAAiBvB,EAAQ,eAAiBwB,EAC/C,KAAK,YAAcxB,EAAQ,YAAcyB,EACzC,KAAK,aAAezB,EAAQ,aAAe0B,EAC3C,KAAK,iBAAmB1B,EAAQ,iBAAmB2B,EAEnD,KAAK,SAAW3B,EAAQ,SAAW,KACnC,KAAK,UAAYA,EAAQ,UAAY,KACrC,KAAK,gBAAkBA,EAAQ,gBAAkB,KACjD,KAAK,sBAAwBA,EAAQ,sBAAwB,KAG7D,KAAK,eAAiB,KAAK,WAAW,KAAK,IAAI,EAC/C,KAAK,kBAAoB,KAAK,oBAAoB,KAAK,IAAI,EAE3D,OAAO,iBAAiB,UAAW,KAAK,cAAc,EACtD,SAAS,iBAAiB,mBAAoB,KAAK,iBAAiB,EAGhEA,EAAQ,YAAc,IACxB,KAAK,cAAA,CAET,CAeA,OAA8B,CAC5B,OAAI,KAAK,WACA,QAAQ,OAAO,IAAI,MAAM,2CAA2C,CAAC,EAGvE,IAAI,QAAqB,CAAC6B,EAASC,IAAW,CACnD,MAAMC,EAAQzC,EAAA,EACd,KAAK,cAAgB,CAAE,QAAAuC,EAAS,OAAAC,EAAQ,MAAAC,CAAA,EAExC,MAAMC,EACJ,GAAG,KAAK,OAAO,yBACD,mBAAmB,KAAK,SAAS,CAAC,WACrC,mBAAmB,OAAO,SAAS,MAAM,CAAC,UAC3C,mBAAmBD,CAAK,CAAC,UACzB,mBAAmB,KAAK,MAAM,CAAC,GAErCE,EAAWxC,EAAc,KAAK,YAAa,KAAK,YAAY,EAC5DyC,EAAQ,OAAO,KAAKF,EAAK,uBAAwBC,CAAQ,EAE/D,GAAI,CAACC,GAASA,EAAM,OAAQ,CAC1B,KAAK,cAAgB,KACrBJ,EAAO,IAAI,MAAM,sEAAsE,CAAC,EACxF,MACF,CAGA,KAAK,gBAAkB,YAAY,IAAM,CACvC,GAAI,CACF,IAAI,CAACI,GAASA,EAAM,UAClB,KAAK,gBAAA,EACD,KAAK,eAAe,CACtB,MAAMC,EAAU,KAAK,cACrB,KAAK,cAAgB,KACrBA,EAAQ,OAAO,IAAI,MAAM,mDAAmD,CAAC,CAC/E,CAEJ,MAAQ,CAER,CACF,EAAG,GAAG,CACR,CAAC,CACH,CAOA,MAAM,QAAwB,CAC5B,GAAI,KAAK,WACP,OAAO,QAAQ,OAAO,IAAI,MAAM,2CAA2C,CAAC,EAG9E,GAAI,CACE,KAAK,eACP,MAAM,MAAM,GAAG,KAAK,QAAQ,gBAAiB,CAC3C,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAA,EAC3B,KAAM,KAAK,UAAU,CACnB,UAAW,KAAK,UAChB,cAAe,KAAK,aAAA,CACrB,CAAA,CACF,CAEL,MAAQ,CAER,CAGA,aAAa,WAAW,gBAAgB,KAAK,SAAS,EAAE,EACxD,KAAK,aAAe,KACpB,KAAK,cAAgB,KACrB,KAAK,UAAY,KACjB,KAAK,aAAe,KACpB,KAAK,oBAAsB,KAC3B,KAAK,iBAAA,EAEL,KAAK,UAAU,KAAK,SAAS,CAC/B,CAeA,MAAM,UAAUtB,EAA+B,CAC7C,GAAI,KAAK,WACP,MAAM,IAAI,MAAM,2CAA2C,EAE7D,GAAI,CAAC,KAAK,aACR,MAAM,IAAI,MAAM,eAAe,EAGjC,MAAMZ,EAAM,MAAM,MAAM,GAAG,KAAK,QAAQ,qBAAsB,CAC5D,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,cAAiB,UAAU,KAAK,YAAY,EAAA,EAE9C,KAAM,KAAK,UAAU,CAAE,KAAAY,EAAM,CAAA,CAC9B,EAEKK,EAAO,MAAMF,EAA0Cf,EAAK,oBAAoB,EACtF,YAAK,aAAeiB,EAAK,YAClBA,EAAK,WACd,CAMA,gBAAgC,CAC9B,OAAO,KAAK,cAAgB,IAC9B,CAKA,kBAAyB,CACvB,KAAK,aAAe,IACtB,CAMA,UAA0B,CACxB,OAAO,KAAK,YACd,CAiBA,iBAAiC,CAC/B,OAAO,KAAK,aACd,CAMA,aAA+B,CAC7B,OAAO,KAAK,SACd,CAKA,YAAsB,CACpB,OAAO,KAAK,eAAiB,IAC/B,CAMA,SAAmB,OACjB,QAAOkB,EAAA,KAAK,YAAL,YAAAA,EAAgB,WAAY,EACrC,CAOA,mBAA4B,CAE1B,MAAO,GADM,KAAK,QAAQ,QAAQ,MAAO,EAAE,CAC7B,+BAChB,CAQA,aAA6B,CAC3B,GAAI,KAAK,WACP,MAAM,IAAI,MAAM,2CAA2C,EAE7D,MAAMJ,EAAM,KAAK,kBAAA,EACjB,OAAO,OAAO,KAAKA,EAAK,SAAU,qBAAqB,CACzD,CAWA,MAAM,cAAgC,CACpC,GAAI,KAAK,WACP,MAAM,IAAI,MAAM,2CAA2C,EAG7D,GAAI,CAAC,KAAK,cACR,MAAM,IAAI,MAAM,oDAAoD,EAItE,OADc,MAAM,KAAK,cAAA,CAE3B,CAQA,SAAgB,CACd,KAAK,WAAa,GAClB,KAAK,aAAe,KACpB,KAAK,cAAgB,KACrB,KAAK,UAAY,KACjB,KAAK,cAAgB,KAErB,OAAO,oBAAoB,UAAW,KAAK,cAAc,EACzD,SAAS,oBAAoB,mBAAoB,KAAK,iBAAiB,EAEvE,KAAK,iBAAA,EACL,KAAK,gBAAA,CACP,CAOQ,YAAa,CACnB,GAAI,CAAC,KAAK,aACR,MAAM,IAAIlC,EAAmB,gBAAiB,CAAE,OAAQ,IAAK,KAAM,gBAAiB,CAExF,CACQ,cAAe,CACrB,MAAMuC,EAAkC,CACtC,cAAe,UAAU,KAAK,YAAY,GAC1C,eAAgB,kBAAA,EAElB,OAAI,KAAK,eACPA,EAAQ,gBAAgB,EAAI,KAAK,cAE5BA,CACT,CASA,MAAc,qBAA8C,CAC1D,OAAI,KAAK,aAAqB,KAAK,aAC/B,KAAK,oBAA4B,KAAK,qBAE1C,KAAK,qBAAuB,SAAY,OACtC,GAAI,CACF,MAAMC,EAAI,MAAM,MAAM,GAAG,KAAK,YAAY,wBAAyB,CACjE,QAAS,KAAK,aAAA,CAAa,CAC5B,EACD,GAAI,CAACA,EAAE,GAAI,OAAO,KAClB,MAAMpB,EAAgB,MAAMoB,EAAE,KAAA,EACxBC,EAAyC,MAAM,QAAQrB,CAAI,EAC7DA,GACEA,GAAA,YAAAA,EAA4D,aAAc,CAAA,EAC1EsB,IAAMJ,EAAAG,GAAA,YAAAA,EAAO,KAAP,YAAAH,EAAW,eAAgB,KACvC,OAAII,SAAU,aAAeA,GACtBA,CACT,MAAQ,CACN,OAAO,IACT,QAAA,CACE,KAAK,oBAAsB,IAC7B,CACF,GAAA,EAEO,KAAK,oBACd,CAGA,MAAc,mBAAqD,CACjE,MAAMH,EAAU,KAAK,aAAA,EACfG,EAAM,MAAM,KAAK,oBAAA,EACvB,OAAIA,IAAKH,EAAQ,uBAAuB,EAAIG,GACrCH,CACT,CAEQ,OAAOlC,EAAc,CAAE,MAAO,GAAG,KAAK,YAAY,GAAGA,CAAI,EAAG,CAC5D,YAAYA,EAAc,CAAE,MAAO,GAAG,KAAK,aAAa,GAAGA,CAAI,EAAG,CAG1E,MAAc,OAAUF,EAAeE,EAA0B,CAC/D,OAAOa,EAAoBf,EAAKE,CAAI,CACtC,CAEA,MAAc,KAAcA,EAA0B,CACpD,KAAK,WAAA,EACL,MAAM6B,EAAM,KAAK,OAAO7B,CAAI,EACtBmC,EAAI,MAAM,MAAMN,EAAK,CAAE,QAAS,KAAK,aAAA,EAAgB,EAC3D,OAAO,KAAK,OAAUM,EAAGnC,CAAI,CAC/B,CACA,MAAc,MAAeA,EAAcD,EAAwB,CACjE,KAAK,WAAA,EACL,MAAMoC,EAAI,MAAM,MAAM,KAAK,OAAOnC,CAAI,EAAG,CACvC,OAAQ,OACR,QAAS,KAAK,aAAA,EACd,KAAMD,IAAS,OAAY,KAAK,UAAUA,CAAI,EAAI,MAAA,CACnD,EACD,OAAO,KAAK,OAAUoC,EAAGnC,CAAI,CAC/B,CACA,MAAc,KAAcA,EAAcD,EAAwB,CAChE,KAAK,WAAA,EACL,MAAMoC,EAAI,MAAM,MAAM,KAAK,OAAOnC,CAAI,EAAG,CACvC,OAAQ,MACR,QAAS,KAAK,aAAA,EACd,KAAMD,IAAS,OAAY,KAAK,UAAUA,CAAI,EAAI,MAAA,CACnD,EACD,OAAO,KAAK,OAAUoC,EAAGnC,CAAI,CAC/B,CACA,MAAc,KAAcA,EAA0B,CACpD,KAAK,WAAA,EACL,MAAMmC,EAAI,MAAM,MAAM,KAAK,OAAOnC,CAAI,EAAG,CAAE,OAAQ,SAAU,QAAS,KAAK,aAAA,EAAgB,EAC3F,OAAO,KAAK,OAAUmC,EAAGnC,CAAI,CAC/B,CAEA,MAAc,MAAeA,EAA0B,CACrD,KAAK,WAAA,EACL,MAAMmC,EAAI,MAAM,MAAM,KAAK,YAAYnC,CAAI,EAAG,CAAE,QAAS,MAAM,KAAK,kBAAA,EAAqB,EACzF,OAAO,KAAK,OAAUmC,EAAGnC,CAAI,CAC/B,CACA,MAAc,OAAgBA,EAAcD,EAAwB,CAClE,KAAK,WAAA,EACL,MAAMoC,EAAI,MAAM,MAAM,KAAK,YAAYnC,CAAI,EAAG,CAC5C,OAAQ,OACR,QAAS,MAAM,KAAK,kBAAA,EACpB,KAAMD,IAAS,OAAY,KAAK,UAAUA,CAAI,EAAI,MAAA,CACnD,EACD,OAAO,KAAK,OAAUoC,EAAGnC,CAAI,CAC/B,CACA,MAAc,MAAeA,EAA0B,CACrD,KAAK,WAAA,EACL,MAAMmC,EAAI,MAAM,MAAM,KAAK,YAAYnC,CAAI,EAAG,CAAE,OAAQ,SAAU,QAAS,MAAM,KAAK,kBAAA,EAAqB,EAC3G,OAAO,KAAK,OAAUmC,EAAGnC,CAAI,CAC/B,CAGQ,WAAWA,EAAcsC,EAAoE,CACnG,MAAMC,EAAO,KAAK,eAAe,QAAQ,MAAO,EAAE,EAC5CV,EAAM,IAAI,IAAI7B,EAAK,WAAW,MAAM,EAAIA,EAAO,GAAGuC,CAAI,GAAGvC,EAAK,WAAW,GAAG,EAAIA,EAAO,IAAIA,CAAI,EAAE,EAAE,EACzG,GAAIsC,EACF,SAAW,CAACE,EAAGjC,CAAC,IAAK,OAAO,QAAQ+B,CAAK,EAChB/B,GAAM,MAAQA,IAAM,IAC3CsB,EAAI,aAAa,IAAIW,EAAG,OAAOjC,CAAC,CAAC,EAGrC,OAAOsB,EAAI,SAAA,CACb,CACA,MAAc,OAAgB7B,EAAcsC,EAAwE,CAClH,KAAK,WAAA,EACL,MAAMT,EAAM,KAAK,WAAW7B,EAAMsC,CAAK,EACjCH,EAAI,MAAM,MAAMN,EAAK,CAAE,QAAS,KAAK,aAAA,EAAgB,EAC3D,OAAO,KAAK,OAAUM,EAAGnC,CAAI,CAC/B,CACA,MAAc,QACZA,EACAD,EACA0C,EACY,CACZ,KAAK,WAAA,EACL,MAAMP,EAAU,CAAE,GAAG,KAAK,eAAgB,GAAIO,GAAgB,EAAC,EACzDN,EAAI,MAAM,MAAM,KAAK,WAAWnC,CAAI,EAAG,CAC3C,OAAQ,OACR,QAAAkC,EACA,KAAMnC,IAAS,OAAY,KAAK,UAAUA,CAAI,EAAI,MAAA,CACnD,EACD,OAAO,KAAK,OAAUoC,EAAGnC,CAAI,CAC/B,CAGA,MAAM,eAA0C,CAAE,OAAO,KAAK,eAAA,CAAiB,CAQ/E,YAAYJ,EAAiB8C,EAAoE,SAC/F,KAAK,WAAA,EACL,MAAMC,EAA2B,OAAOD,GAAsB,SAC1D,CAAE,SAAUA,CAAA,EACXA,GAAqB,CAAA,EAEpB3C,EAA4B,CAChC,QAAAH,EACA,UAAW+C,EAAK,QAAA,EAElB,OAAIA,EAAK,QAAO5C,EAAK,MAAQ4C,EAAK,OAC9BA,EAAK,YAAW5C,EAAK,WAAa4C,EAAK,YACvCV,EAAAU,EAAK,SAAL,MAAAV,EAAa,SACflC,EAAK,OAAS4C,EAAK,OAAO,IAAIC,IAAQ,CACpC,YAAaA,EAAI,OACjB,WAAYA,EAAI,SAAA,EAChB,IAEAC,EAAAF,EAAK,QAAL,MAAAE,EAAY,SACd9C,EAAK,MAAQ4C,EAAK,MAAM,IAAIG,IAAM,CAChC,KAAMA,EAAE,KACR,eAAgBA,EAAE,cAClB,UAAWA,EAAE,SACb,KAAMA,EAAE,IAAA,EACR,GAEAH,EAAK,QACP5C,EAAK,MAAQ,CACX,kBAAmB4C,EAAK,MAAM,gBAC9B,iBAAkBA,EAAK,MAAM,eAC7B,YAAaA,EAAK,MAAM,WACxB,YAAaA,EAAK,MAAM,UAAA,IAGpB,SAAY,CAClB,MAAMT,EAAU,MAAM,KAAK,kBAAA,EAC3B,OAAO,MAAM,KAAK,YAAY,cAAc,EAAG,CAC7C,OAAQ,OACR,QAAAA,EACA,KAAM,KAAK,UAAUnC,CAAI,CAAA,CAC1B,CACH,GAAA,CACF,CACA,gBAAgBgD,EAAuC,CACrD,YAAK,WAAA,GACG,SAAY,CAClB,MAAMb,EAAU,MAAM,KAAK,kBAAA,EAC3B,OAAO,MAAM,KAAK,YAAY,sCAAsC,mBAAmBa,CAAU,CAAC,cAAc,EAAG,CAAE,OAAQ,OAAQ,QAAAb,EAAS,CAChJ,GAAA,CACF,CACA,MAAM,UAAUc,EAAuC,CAAE,OAAO,KAAK,OAAmB,oBAAqB,CAAE,UAAWA,EAAU,CAAE,CACtI,MAAM,SAASA,EAAsC,CAAE,OAAO,KAAK,MAAiB,yBAAyB,mBAAmBA,CAAQ,CAAC,EAAE,CAAE,CAC7I,MAAM,SAASC,EAAiBD,EAAwC,CAAE,OAAO,KAAK,OAAmB,cAAe,CAAE,SAAUC,EAAS,UAAWD,EAAU,CAAE,CACpK,MAAM,mBAAmBA,EAAgC,CAAE,OAAO,KAAK,OAAO,oBAAqB,CAAE,UAAWA,EAAU,CAAE,CAG5H,MAAM,aAAaE,EAAiC,SAClD,MAAMF,IAAWf,EAAA,OAAO,aAAP,YAAAA,EAAA,eAAyB,UAAU,KAAK,KAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,GACjGkB,IAASN,EAAA,KAAK,YAAL,YAAAA,EAAgB,aAAc,GAC7C,OAAO,KAAK,MAAc,qBAAsB,CAAE,UAAWG,EAAU,QAASG,EAAQ,MAAOD,GAAS,EAAA,CAAI,CAC9G,CACA,MAAM,aAA2C,CAAE,OAAO,KAAK,KAAyB,oBAAoB,CAAE,CAC9G,MAAM,UAAUF,EAAmC,CAAE,OAAO,KAAK,KAAa,sBAAsBA,CAAQ,EAAE,CAAE,CAChH,MAAM,aAAaA,EAAuC,CAAE,OAAO,KAAK,KAAiB,sBAAsBA,CAAQ,EAAE,CAAE,CAC3H,MAAM,cAAcV,EAA8C,CAAE,OAAO,KAAK,KAA2B,+BAA+B,mBAAmBA,CAAK,CAAC,EAAE,CAAE,CACvK,MAAM,UAAUU,EAAkBI,EAAsC,CAAE,OAAO,KAAK,MAAkB,sBAAsBJ,CAAQ,OAAQ,CAAE,OAAAI,EAAQ,CAAE,CAC1J,MAAM,kBAAkBJ,EAAkBE,EAAoC,CAAE,OAAO,KAAK,MAAkB,sBAAsBF,CAAQ,SAAU,CAAE,MAAAE,EAAO,CAAE,CAGjK,MAAM,aAAaF,EAAkBK,EAA8C,CAAE,OAAO,KAAK,KAA0B,iCAAiCL,CAAQ,GAAGK,EAAQ,UAAUA,CAAK,GAAK,EAAE,EAAE,CAAE,CACzM,MAAM,eAAeL,EAAuC,CAAE,OAAO,KAAK,KAAiB,iCAAiCA,CAAQ,EAAE,CAAE,CAGxI,MAAM,gBAAiD,CAAE,OAAO,KAAK,KAA4B,uBAAuB,CAAE,CAC1H,MAAM,mBAAmBM,EAA+C,CAAE,OAAO,KAAK,KAAsB,6CAA6CA,CAAW,EAAE,CAAE,CACxK,MAAM,oBAAoBA,EAAgD,CAAE,OAAO,KAAK,KAAuB,8CAA8CA,CAAW,EAAE,CAAE,CAC5K,MAAM,iBAAsC,CAAE,OAAO,KAAK,MAAiB,8BAA8B,CAAE,CAC3G,MAAM,eAAeA,EAA0C,CAAE,OAAO,KAAK,MAAkB,8BAA+B,CAAE,aAAcA,EAAa,CAAE,CAC7J,MAAM,cAAcA,EAA0C,CAAE,OAAO,KAAK,MAAkB,6BAA8B,CAAE,aAAcA,EAAa,CAAE,CAC3J,MAAM,iBAAiBA,EAA0C,CAAE,OAAO,KAAK,MAAkB,gCAAiC,CAAE,aAAcA,EAAa,CAAE,CACjK,MAAM,cAAcA,EAA0C,CAAE,OAAO,KAAK,MAAkB,6BAA8B,CAAE,aAAcA,EAAa,CAAE,CAC3J,MAAM,gBAAgBA,EAAqBC,EAAmC,CAAE,OAAO,KAAK,KAAiB,+BAAgC,CAAE,aAAcD,EAAa,KAAAC,EAAM,CAAE,CAGlL,MAAM,kBAAkD,CAAE,OAAO,KAAK,KAA2B,qBAAqB,CAAE,CACxH,MAAM,aAAajB,EAA8C,CAAE,OAAO,KAAK,KAA2B,gCAAgC,mBAAmBA,CAAK,CAAC,EAAE,CAAE,CACvK,MAAM,eAAekB,EAAgBD,EAAoC,CAAE,OAAO,KAAK,KAAkB,uBAAuBC,CAAM,IAAID,CAAI,EAAE,CAAE,CAGlJ,MAAM,YAAYE,EAAgBC,EAAiD,CAAE,OAAO,KAAK,MAA2B,2BAA4B,CAAE,YAAaD,EAAQ,WAAYC,EAAW,CAAE,CACxM,MAAM,gBAAgBC,EAAkD,CAAE,OAAO,KAAK,MAA0B,wBAAyB,CAAE,aAAcA,EAAa,CAAE,CACxK,MAAM,iBAAiB7C,EAA2C,CAAE,OAAO,KAAK,MAA0B,iBAAkB,CAAE,KAAAA,EAAM,CAAE,CAGtI,MAAM,YAAYkC,EAAkBY,EAAuC,CAAE,OAAO,KAAK,MAAa,oBAAqB,CAAE,UAAWZ,EAAU,YAAaY,EAAY,CAAE,CAC7K,MAAM,YAAyC,CAAE,OAAO,KAAK,KAAwB,mBAAmB,CAAE,CAC1G,MAAM,SAASC,EAAiC,CAAE,OAAO,KAAK,KAAY,qBAAqBA,CAAO,EAAE,CAAE,CAC1G,MAAM,YAAYA,EAAsC,CAAE,OAAO,KAAK,KAAiB,qBAAqBA,CAAO,EAAE,CAAE,CACvH,MAAM,UAAUA,EAAiC,CAAE,OAAO,KAAK,MAAa,qBAAqBA,CAAO,OAAO,CAAE,CAGjH,MAAM,YAAYC,EAAmBC,EAAcC,EAAsC,CAAE,OAAO,KAAK,KAAiB,sBAAuB,CAAE,WAAYF,EAAW,KAAAC,EAAM,OAAAC,EAAQ,CAAE,CACxL,MAAM,eAAeF,EAAwC,CAAE,OAAO,KAAK,KAAiB,kCAAkCA,CAAS,EAAE,CAAE,CAG3I,MAAM,UAAqC,CAAE,OAAO,KAAK,MAAuB,iBAAiB,CAAE,CACnG,MAAM,UAAUG,EAA2B,CAAE,OAAO,KAAK,OAAY,kBAAmBA,CAAM,CAAE,CAGhG,MAAM,gBAAgBX,EAA0C,CAAE,OAAO,KAAK,KAAiB,sCAAsCA,CAAW,EAAE,CAAE,CACpJ,MAAM,iBAAiBY,EAAqC,CAAE,OAAO,KAAK,MAAkB,uCAAwC,CAAE,QAASA,EAAQ,CAAE,CACzJ,MAAM,gBAAgBZ,EAA0C,CAAE,OAAO,KAAK,MAAkB,yBAAyBA,CAAW,SAAS,CAAE,CAC/I,MAAM,cAAmC,CAAE,OAAO,KAAK,KAAgB,gBAAgB,CAAE,CAGzF,MAAM,cAAyC,CAAE,OAAO,KAAK,KAAsB,qCAAqC,CAAE,CAC1H,MAAM,aAA2C,CAAE,OAAO,KAAK,KAAyB,+BAA+B,CAAE,CAGzH,MAAM,cAAoC,CAAE,OAAO,KAAK,MAAkB,8BAA8B,CAAE,CAC1G,MAAM,aAAaa,EAA4C,CAAE,OAAO,KAAK,KAAiB,wCAAwCA,CAAa,EAAE,CAAE,CAGvJ,MAAM,kBAAqD,CAAE,OAAO,KAAK,MAA+B,gBAAgB,CAAE,CAG1H,MAAM,oBAAoBC,EAAqC,CAC7D,KAAK,WAAA,EACL,MAAMpE,EAAO,2BACPmC,EAAI,MAAM,MAAM,GAAG,KAAK,QAAQ,GAAGnC,CAAI,GAAI,CAC/C,OAAQ,OACR,QAAS,KAAK,aAAA,EACd,KAAM,KAAK,UAAUoE,CAAM,CAAA,CAC5B,EACD,OAAOvD,EAAgCsB,EAAGnC,CAAI,CAChD,CAWA,MAAM,YAAqC,CACzC,OAAO,KAAK,OAAsB,cAAc,CAClD,CAUA,MAAM,iBAAiBoE,EAA8D,CACnF,OAAO,KAAK,OAA8B,eAAgB,CACxD,KAAMA,GAAA,YAAAA,EAAQ,KACd,UAAWA,GAAA,YAAAA,EAAQ,UACnB,WAAYA,GAAA,YAAAA,EAAQ,WACpB,SAAUA,GAAA,YAAAA,EAAQ,QAAA,CACnB,CACH,CAMA,MAAM,gBAAgBA,EAA4D,CAChF,OAAO,KAAK,OAA6B,cAAe,CACtD,KAAMA,GAAA,YAAAA,EAAQ,KACd,UAAWA,GAAA,YAAAA,EAAQ,SAAA,CACpB,CACH,CAOA,MAAM,oBAAoBA,EAAoE,CAC5F,OAAO,KAAK,OAAiC,mBAAoB,CAC/D,KAAMA,GAAA,YAAAA,EAAQ,IAAA,CACf,CACH,CAMA,MAAM,kBAAmD,CACvD,OAAO,KAAK,OAA8B,cAAc,CAC1D,CASA,MAAM,kBAAkBC,EAAyC,CAC/D,OAAO,KAAK,OAAuB,WAAW,mBAAmBA,CAAM,CAAC,EAAE,CAC5E,CAOA,MAAM,oBAAoBD,EAA0E,CAClG,OAAO,KAAK,QAAqC,6BAA8BA,CAAM,CACvF,CAMA,MAAM,eAAeA,EAAyE,CAC5F,MAAMrE,EAA8B,OAAOqE,GAAW,SAAW,CAAE,KAAMA,GAAWA,EACpF,OAAO,KAAK,QAAgC,yBAA0BrE,CAAI,CAC5E,CAMA,MAAM,0BAA2D,CAC/D,OAAO,KAAK,OAA8B,qBAAqB,CACjE,CAQA,MAAM,eACJqE,EACAE,EACiC,CACjC,MAAMvE,EAA8B,OAAOqE,GAAW,SAAW,CAAE,OAAQA,GAAWA,EAChFG,EAAQD,EAAiB,CAAE,kBAAmBA,GAAmB,OACvE,OAAO,KAAK,QAAgC,uBAAwBvE,EAAMwE,CAAK,CACjF,CAMA,MAAM,cAAmC,CACvC,OAAO,KAAK,OAAkB,iBAAiB,CACjD,CAOA,MAAM,sBAAwD,CAC5D,OAAO,KAAK,QAAgC,uBAAuB,CACrE,CAMA,MAAM,UAAUH,EAA+D,CAC7E,MAAMrE,EAAyB,OAAOqE,GAAW,SAAW,CAAE,gBAAiBA,GAAWA,EAC1F,OAAO,KAAK,QAA2B,kBAAmBrE,CAAI,CAChE,CAMA,MAAM,mBAA6C,CACjD,OAAO,KAAK,OAAuB,sBAAsB,CAC3D,CAMA,MAAM,iBAAiBqE,EAAqE,CAC1F,MAAMrE,EAA4B,OAAOqE,GAAW,SAAW,CAAE,cAAeA,GAAWA,EAC3F,OAAO,KAAK,QAA8B,qBAAsBrE,CAAI,CACtE,CAMA,MAAM,qBAAyD,CAC7D,OAAO,KAAK,OAAiC,wBAAwB,CACvE,CAMA,MAAM,0BAA2D,CAC/D,OAAO,KAAK,OAA8B,8BAA8B,CAC1E,CAMA,MAAM,sBAA8D,CAClE,OAAO,KAAK,QAAsC,6BAA6B,CACjF,CAMA,MAAM,YAAYoD,EAA4C,OAC5D,MAAMqB,EAAKrB,KAAUlB,EAAA,KAAK,YAAL,YAAAA,EAAgB,YACrC,GAAI,CAACuC,EAAI,MAAM,IAAI,MAAM,qDAAqD,EAE9E,GAAI,CAAC,KAAK,aAAc,CACtB,MAAMxE,EAAO,qBAAqB,mBAAmBwE,CAAE,CAAC,aAClDrC,EAAI,MAAM,MAAM,KAAK,WAAWnC,CAAI,CAAC,EAC3C,OAAOa,EAAmCsB,EAAGnC,CAAI,CACnD,CACA,OAAO,KAAK,OAAyB,qBAAqB,mBAAmBwE,CAAE,CAAC,YAAY,CAC9F,CASA,IAAI,SAAU,CACZ,MAAO,CACL,cAAe,KAAK,cAAc,KAAK,IAAI,EAC3C,YAAa,KAAK,YAAY,KAAK,IAAI,EACvC,QAAS,KAAK,QAAQ,KAAK,IAAI,EAC/B,kBAAmB,KAAK,kBAAkB,KAAK,IAAI,EACnD,YAAa,KAAK,YAAY,KAAK,IAAI,CAAA,CAE3C,CAGA,IAAI,MAAO,CACT,MAAO,CACL,KAAM,KAAK,YAAY,KAAK,IAAI,EAChC,YAAa,KAAK,YAAY,KAAK,IAAI,EACvC,UAAW,KAAK,gBAAgB,KAAK,IAAI,EACzC,gBAAiB,KAAK,gBAAgB,KAAK,IAAI,EAC/C,UAAW,KAAK,UAAU,KAAK,IAAI,EACnC,SAAU,KAAK,SAAS,KAAK,IAAI,EACjC,SAAU,KAAK,SAAS,KAAK,IAAI,EACjC,mBAAoB,KAAK,mBAAmB,KAAK,IAAI,EACrD,oBAAqB,KAAK,oBAAoB,KAAK,IAAI,EACvD,wBAAyB,KAAK,wBAAwB,KAAK,IAAI,EAC/D,uBAAwB,KAAK,uBAAuB,KAAK,IAAI,CAAA,CAEjE,CAGA,IAAI,SAAU,CACZ,MAAO,CACL,OAAQ,KAAK,aAAa,KAAK,IAAI,EACnC,KAAM,KAAK,YAAY,KAAK,IAAI,EAChC,IAAK,KAAK,UAAU,KAAK,IAAI,EAC7B,OAAQ,KAAK,aAAa,KAAK,IAAI,EACnC,OAAQ,KAAK,cAAc,KAAK,IAAI,EACpC,IAAK,KAAK,UAAU,KAAK,IAAI,EAC7B,YAAa,KAAK,kBAAkB,KAAK,IAAI,CAAA,CAEjD,CAGA,IAAI,UAAW,CACb,MAAO,CACL,KAAM,KAAK,aAAa,KAAK,IAAI,EACjC,OAAQ,KAAK,eAAe,KAAK,IAAI,CAAA,CAEzC,CAGA,IAAI,YAAa,CACf,MAAO,CACL,KAAM,KAAK,eAAe,KAAK,IAAI,EACnC,OAAQ,KAAK,mBAAmB,KAAK,IAAI,EACzC,QAAS,KAAK,oBAAoB,KAAK,IAAI,EAC3C,OAAQ,KAAK,gBAAgB,KAAK,IAAI,EACtC,MAAO,KAAK,eAAe,KAAK,IAAI,EACpC,KAAM,KAAK,cAAc,KAAK,IAAI,EAClC,QAAS,KAAK,iBAAiB,KAAK,IAAI,EACxC,KAAM,KAAK,cAAc,KAAK,IAAI,EAClC,OAAQ,KAAK,gBAAgB,KAAK,IAAI,EACtC,OAAQ,KAAK,gBAAgB,KAAK,IAAI,EACtC,iBAAkB,KAAK,iBAAiB,KAAK,IAAI,EACjD,OAAQ,KAAK,gBAAgB,KAAK,IAAI,EACtC,aAAc,KAAK,aAAa,KAAK,IAAI,CAAA,CAE7C,CAGA,IAAI,QAAS,CACX,MAAO,CACL,QAAS,KAAK,iBAAiB,KAAK,IAAI,EACxC,OAAQ,KAAK,aAAa,KAAK,IAAI,EACnC,OAAQ,KAAK,eAAe,KAAK,IAAI,CAAA,CAEzC,CAGA,IAAI,OAAQ,CACV,MAAO,CACL,YAAa,KAAK,YAAY,KAAK,IAAI,EACvC,gBAAiB,KAAK,gBAAgB,KAAK,IAAI,EAC/C,iBAAkB,KAAK,iBAAiB,KAAK,IAAI,CAAA,CAErD,CAGA,IAAI,QAAS,CACX,MAAO,CACL,OAAQ,KAAK,YAAY,KAAK,IAAI,EAClC,KAAM,KAAK,WAAW,KAAK,IAAI,EAC/B,IAAK,KAAK,SAAS,KAAK,IAAI,EAC5B,OAAQ,KAAK,YAAY,KAAK,IAAI,EAClC,KAAM,KAAK,UAAU,KAAK,IAAI,CAAA,CAElC,CAGA,IAAI,UAAW,CACb,MAAO,CACL,KAAM,KAAK,YAAY,KAAK,IAAI,EAChC,OAAQ,KAAK,eAAe,KAAK,IAAI,CAAA,CAEzC,CAGA,IAAI,MAAO,CACT,MAAO,CACL,KAAM,KAAK,SAAS,KAAK,IAAI,EAC7B,OAAQ,KAAK,UAAU,KAAK,IAAI,EAChC,IAAK,KAAK,OAAO,KAAK,IAAI,EAC1B,MAAO,KAAK,SAAS,KAAK,IAAI,EAC9B,OAAQ,KAAK,UAAU,KAAK,IAAI,EAChC,QAAS,KAAK,WAAW,KAAK,IAAI,CAAA,CAEtC,CAGA,IAAI,QAAS,CACX,MAAO,CACL,aAAc,KAAK,aAAa,KAAK,IAAI,EACzC,KAAM,KAAK,YAAY,KAAK,IAAI,EAChC,OAAQ,KAAK,aAAa,KAAK,IAAI,EACnC,OAAQ,KAAK,aAAa,KAAK,IAAI,EACnC,iBAAkB,KAAK,iBAAiB,KAAK,IAAI,EACjD,oBAAqB,KAAK,oBAAoB,KAAK,IAAI,CAAA,CAE3D,CAMA,IAAI,QAAS,CACX,MAAO,CACL,WAAY,KAAK,WAAW,KAAK,IAAI,EACrC,WAAY,KAAK,WAAW,KAAK,IAAI,EACrC,WAAY,KAAK,iBAAiB,KAAK,IAAI,EAC3C,UAAW,KAAK,gBAAgB,KAAK,IAAI,EACzC,cAAe,KAAK,oBAAoB,KAAK,IAAI,EACjD,WAAY,KAAK,iBAAiB,KAAK,IAAI,EAC3C,YAAa,KAAK,kBAAkB,KAAK,IAAI,EAC7C,oBAAqB,KAAK,oBAAoB,KAAK,IAAI,EACvD,eAAgB,KAAK,eAAe,KAAK,IAAI,EAC7C,iBAAkB,KAAK,yBAAyB,KAAK,IAAI,EACzD,eAAgB,KAAK,eAAe,KAAK,IAAI,EAC7C,aAAc,KAAK,aAAa,KAAK,IAAI,EACzC,qBAAsB,KAAK,qBAAqB,KAAK,IAAI,EACzD,UAAW,KAAK,UAAU,KAAK,IAAI,EACnC,kBAAmB,KAAK,kBAAkB,KAAK,IAAI,EACnD,iBAAkB,KAAK,iBAAiB,KAAK,IAAI,EACjD,oBAAqB,KAAK,oBAAoB,KAAK,IAAI,EACvD,yBAA0B,KAAK,yBAAyB,KAAK,IAAI,EACjE,qBAAsB,KAAK,qBAAqB,KAAK,IAAI,EACzD,YAAa,KAAK,YAAY,KAAK,IAAI,CAAA,CAE3C,CAOQ,YAAqB,CAC3B,OAAO,KAAK,YACd,CAiBA,qBAAiC,OAC/B,KAAK,WAAA,EAEL,MAAM3C,EAAM,IAAI,IAAI,GAAG,KAAK,WAAA,CAAY,UAAU,EAC5CsB,GAASlB,EAAA,KAAK,YAAL,YAAAA,EAAgB,WAC/B,OAAIkB,GAAQtB,EAAI,aAAa,IAAI,UAAWsB,CAAM,EAC9C,KAAK,cAActB,EAAI,aAAa,IAAI,QAAS,KAAK,YAAY,EAC/D,IAAI,UAAUA,EAAI,UAAU,CACrC,CAmBA,wBAAwB4C,EAA8B,CACpD,KAAK,WAAA,EACL,MAAM5C,EAAM,IAAI,IAAI,GAAG,KAAK,YAAY,gBAAgB4C,CAAS,EAAE,EACnE,OAAO,IAAI,UAAU5C,EAAI,UAAU,CACrC,CAaA,wBAAoC,CAClC,KAAK,WAAA,EACL,MAAMA,EAAM,IAAI,IAAI,GAAG,KAAK,WAAA,CAAY,aAAa,EACrD,OAAI,KAAK,cAAcA,EAAI,aAAa,IAAI,QAAS,KAAK,YAAY,EAC/D,IAAI,UAAUA,EAAI,UAAU,CACrC,CAOQ,WAAW6C,EAA2B,CAE5C,GAAIA,EAAM,SAAW,KAAK,QAAS,OAEnC,MAAM3D,EAAO2D,EAAM,KACnB,GAAI,GAAC3D,GAAQ,OAAOA,EAAK,MAAS,UAElC,OAAQA,EAAK,KAAA,CACX,IAAK,yBACH,KAAK,mBAAmBA,CAAI,EAC5B,MACF,IAAK,uBACH,KAAK,iBAAiBA,EAAK,MAAOA,EAAK,OAAO,EAC9C,MACF,IAAK,2BACH,KAAK,qBAAA,EACL,KAAA,CAEN,CAGQ,mBAAmBA,EAAgC,CAEzD,GAAI,KAAK,eAAiBA,EAAK,QAAU,KAAK,cAAc,MAC1D,OAGF,KAAK,aAAeA,EAAK,YACzB,KAAK,cAAgBA,EAAK,aAC1B,KAAK,UAAYA,EAAK,UAAY,KAElC,KAAK,aAAe,KACpB,KAAK,oBAAsB,KAG3B,aAAa,QAAQ,gBAAgB,KAAK,SAAS,GAAIA,EAAK,YAAY,EAExE,KAAK,gBAAA,EACL,KAAK,kBAAA,EAEL,MAAM4D,EAAsB,CAC1B,YAAa,KAAK,aAClB,aAAc,KAAK,cACnB,UAAW5D,EAAK,UAChB,SAAU,KAAK,SAAA,EAIjB,GAAI,KAAK,cAAe,CACtB,MAAMiB,EAAU,KAAK,cACrB,KAAK,cAAgB,KACrBA,EAAQ,QAAQ2C,CAAM,CACxB,CAGA,KAAK,UAAU,KAAK,SAAUA,CAAM,CACtC,CAGQ,iBAAiBC,EAAehF,EAAuB,CAG7D,GAFA,KAAK,gBAAA,EAED,KAAK,cAAe,CACtB,MAAMoC,EAAU,KAAK,cACrB,KAAK,cAAgB,KACrBA,EAAQ,OAAO,IAAI,MAAM,eAAe4C,CAAK,MAAMhF,CAAO,EAAE,CAAC,CAC/D,CACF,CAGQ,sBAA6B,CAGnC,GAFA,KAAK,gBAAA,EAED,KAAK,cAAe,CACtB,MAAMoC,EAAU,KAAK,cACrB,KAAK,cAAgB,KACrBA,EAAQ,OAAO,IAAI,MAAM,kCAAkC,CAAC,CAC9D,CACF,CAGQ,2BAAkC,CAExC,KAAK,iBAAA,EAGL,aAAa,WAAW,gBAAgB,KAAK,SAAS,EAAE,EACxD,KAAK,cAAgB,KAGrB,KAAK,UAAU,KAAK,qBAAqB,CAC3C,CAOQ,eAAsB,CAC5B,MAAM6C,EAAS,aAAa,QAAQ,gBAAgB,KAAK,SAAS,EAAE,EAChEA,IACF,KAAK,cAAgBA,EACrB,KAAK,WAAA,EAET,CAGA,MAAc,YAA4B,CACxC,GAAI,OAAK,YAAc,CAAC,KAAK,eAE7B,GAAI,CACF,MAAM,KAAK,cAAA,CACb,MAAQ,CACN,KAAK,0BAAA,CACP,CACF,CAMA,MAAc,eAAiC,CAC7C,MAAMC,EAAO,MAAM,MAAM,GAAG,KAAK,QAAQ,iBAAkB,CACzD,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAA,EAC3B,KAAM,KAAK,UAAU,CACnB,UAAW,KAAK,UAChB,cAAe,KAAK,aAAA,CACrB,CAAA,CACF,EAED,GAAI,CAACA,EAAK,GACR,MAAM,IAAI,MAAM,sBAAsB,EAGxC,MAAM/D,EAAO,MAAM+D,EAAK,KAAA,EACxB,KAAK,aAAe/D,EAAK,aAGpB,KAAK,eACR,KAAK,kBAAA,EAIP,KAAK,UAAU,KAAK,gBAAiBA,EAAK,YAAY,EAGtD,MAAMgE,EAAW,MAAM,KAAK,eAAA,EAC5B,OAAIA,IACF,KAAK,UAAYA,EAEjB,KAAK,UAAU,KAAK,SAAU,CAC5B,YAAa,KAAK,aAClB,aAAc,KAAK,cACnB,UAAWhE,EAAK,YAAc,EAC9B,SAAU,KAAK,SAAA,CAChB,GAGIA,EAAK,YACd,CAKA,MAAc,gBAA2C,CACvD,GAAI,CAAC,KAAK,aAAc,OAAO,KAC/B,GAAI,CACF,MAAM+D,EAAO,MAAM,MAAM,GAAG,KAAK,YAAY,qBAAsB,CACjE,OAAQ,MACR,QAAS,CACP,cAAe,UAAU,KAAK,YAAY,EAAA,CAC5C,CACD,EACD,GAAI,CAACA,EAAK,GAAI,OAAO,KACrB,MAAM/D,EAAO,MAAM+D,EAAK,KAAA,EACxB,MAAO,CACL,WAAY/D,EAAK,YAAcA,EAAK,cAAgB,GACpD,UAAWA,EAAK,WAAaA,EAAK,YAAcA,EAAK,WAAa,GAClE,YAAaA,EAAK,aAAeA,EAAK,cAAgBA,EAAK,QAAU,GACrE,QAASA,EAAK,SAAW,EAAA,CAE7B,MAAQ,CACN,OAAO,IACT,CACF,CAGQ,mBAA0B,CAChC,KAAK,iBAAA,EACL,KAAK,cAAgB,YAAY,IAAM,CACrC,KAAK,WAAA,CACP,EAAG,KAAK,gBAAgB,CAC1B,CAGQ,kBAAyB,CAC3B,KAAK,gBACP,cAAc,KAAK,aAAa,EAChC,KAAK,cAAgB,KAEzB,CAGQ,iBAAwB,CAC1B,KAAK,kBACP,cAAc,KAAK,eAAe,EAClC,KAAK,gBAAkB,KAE3B,CAGQ,qBAA4B,CAC9B,SAAS,kBAAoB,WAAa,KAAK,cAAgB,CAAC,KAAK,YACvE,KAAK,WAAA,CAET,CAOQ,UAA+BiE,KAAsCC,EAAe,CAC1F,GAAKD,EACL,GAAI,CACFA,EAAG,GAAGC,CAAI,CACZ,OAASC,EAAG,CACV,QAAQ,MAAM,kCAAmCA,CAAC,CACpD,CACF,CAMA,MAAM,gBAAgBlC,EAAkBK,EAA8C,CAAE,OAAO,KAAK,KAA0B,sBAAsBL,CAAQ,wBAAwBK,GAAS,EAAE,EAAE,CAAE,CACnM,MAAM,oBAAoBL,EAAkBmC,EAAoD,CAAE,OAAO,KAAK,KAAiB,sBAAsBnC,CAAQ,YAAa,CAAE,SAAAmC,EAAU,CAAE,CAGxL,MAAM,OAAOC,EAA6B,CAAE,OAAO,KAAK,MAAW,mBAAmBA,CAAK,EAAE,CAAE,CAC/F,MAAM,SAASA,EAAoC,CAAE,OAAO,KAAK,OAAmB,mBAAmBA,CAAK,QAAQ,CAAE,CACtH,MAAM,UAAUA,EAAoC,CAAE,OAAO,KAAK,OAAmB,mBAAmBA,CAAK,SAAS,CAAE,CACxH,MAAM,WAAWA,EAAoC,CAAE,OAAO,KAAK,OAAmB,mBAAmBA,CAAK,UAAU,CAAE,CAC1H,MAAM,UAAUA,EAAoC,CAAE,OAAO,KAAK,MAAkB,mBAAmBA,CAAK,EAAE,CAAE,CAChH,MAAM,eAAepC,EAAkBc,EAAwC,CAAE,OAAO,KAAK,OAAmB,gCAAgCd,CAAQ,eAAec,CAAS,EAAE,CAAE,CAGpL,MAAM,kBAAiC,CAAE,OAAO,KAAK,KAAK,0BAA0B,CAAE,CACtF,MAAM,4BAAyD,CAAE,OAAO,KAAK,KAAwB,uCAAuC,CAAE,CAC9I,MAAM,uBAA6C,CAAE,OAAO,KAAK,MAAkB,oCAAoC,CAAE,CAGzH,MAAM,iBAAgD,CAAE,OAAO,KAAK,KAA0B,oBAAoB,CAAE,CACpH,MAAM,qBAAqBT,EAA8B,CAAE,OAAO,KAAK,KAAK,0BAA0BA,EAAQ,UAAUA,CAAK,GAAK,EAAE,EAAE,CAAE,CACxI,MAAM,sBAAqC,CAAE,OAAO,KAAK,KAAK,wBAAwB,CAAE,CACxF,MAAM,WAA0B,CAAE,OAAO,KAAK,KAAK,kBAAkB,CAAE,CACvE,MAAM,iBAAgC,CAAE,OAAO,KAAK,KAAK,yBAAyB,CAAE,CACpF,MAAM,SAA+B,CAAE,OAAO,KAAK,MAAkB,oBAAoB,CAAE,CAC3F,MAAM,WAAWgC,EAAuC,CAAE,OAAO,KAAK,MAAkB,mBAAoB,CAAE,UAAWA,EAAU,CAAE,CAGrI,MAAM,iBAAgC,CAAE,OAAO,KAAK,KAAK,mBAAmB,CAAE,CAC9E,MAAM,mBAAmBC,EAAkD,CAAE,OAAO,KAAK,KAAiB,oBAAqBA,CAAM,CAAE,CACvI,MAAM,kBAAiC,CAAE,OAAO,KAAK,KAAK,oBAAoB,CAAE,CAChF,MAAM,oBAAoBC,EAAoD,CAAE,OAAO,KAAK,KAAiB,qBAAsBA,CAAQ,CAAE,CAG7I,MAAM,YAAmC,CAAE,OAAO,KAAK,MAAmB,cAAc,CAAE,CAG1F,MAAM,iBAAgC,CAAE,OAAO,KAAK,KAAK,qCAAqC,CAAE,CAChG,MAAM,gBAAgBC,EAAkC,CAAE,OAAO,KAAK,KAAiB,sCAAuCA,CAAM,CAAE,CACtI,MAAM,iBAAgC,CAAE,OAAO,KAAK,KAAK,qCAAqC,CAAE,CAChG,MAAM,gBAA+B,CAAE,OAAO,KAAK,KAAK,kBAAkB,CAAE,CAC5E,MAAM,iBAA0C,CAAE,OAAO,KAAK,KAAoB,mBAAmB,CAAE,CACzG"}