@forge-connect/react 1.0.12 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider.tsx","../src/context.ts","../src/api/client.ts","../src/utils.ts","../src/components/login-modal.tsx","../src/hooks/use-forge-connect.ts","../src/components/modal-overlay.tsx","../src/components/tabs/email-password.tsx","../src/resolve-config.ts","../src/components/tabs/email-otp.tsx","../src/components/tabs/wallet-connect.tsx","../src/components/svg-icon.tsx","../src/components/tabs/oauth-buttons.tsx","../src/components/tabs/forgot-password.tsx","../src/components/tabs/verify-2fa.tsx","../src/components/account-modal.tsx","../src/hooks/use-user.ts","../src/hooks/use-wallets.ts","../src/lib/utils.ts","../src/hooks/use-sessions.ts","../src/components/two-factor-modal.tsx","../src/components/passkeys-modal.tsx","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/bufferToBase64URLString.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/base64URLStringToBuffer.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/browserSupportsWebAuthn.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/toPublicKeyCredentialDescriptor.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/isValidDomain.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/webAuthnError.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/identifyRegistrationError.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/webAuthnAbortService.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/toAuthenticatorAttachment.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/methods/startRegistration.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/browserSupportsWebAuthnAutofill.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/identifyAuthenticationError.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/methods/startAuthentication.js","../src/components/password-modal.tsx","../src/components/error-view.tsx","../src/components/delete-account-modal.tsx","../src/components/link-auth-modal.tsx","../src/components/login-button.tsx","../src/components/account-button.tsx","../src/hooks/use-admin.ts","../src/hooks/use-roles.ts","../src/lib/permissions.ts"],"sourcesContent":["import { useState, useCallback, useEffect, useRef, useMemo, type ReactNode } from 'react';\nimport { ForgeConnectContext, type ForgeConnectContextValue, type WalletAdapterContext } from './context.js';\nimport { createApiClient, ForgeConnectApiError } from './api/client.js';\nimport type { AuthState, ModalState, AccountModalState, LinkModalState, ForgeConnectConfig, User, ModalStep } from './types.js';\nimport { getRefreshDelay } from './utils.js';\nimport { LoginModal } from './components/login-modal.js';\nimport { AccountModal } from './components/account-modal.js';\nimport { LinkAuthModal } from './components/link-auth-modal.js';\nimport { resolveLoginMethods, resolveInitialStep, isOAuthMethod } from './resolve-config.js';\nimport { startRegistration, startAuthentication } from './runtime-imports.js';\nimport { uint8ArrayToBase58 } from './lib/utils.js';\n\n// Module-level OAuth exchange cache. Each one-time code maps to its pending or resolved\n// exchange promise. The persistent provider (post-StrictMode-remount) re-awaits the same\n// promise so it sees the result even if the transient first mount kicked off the exchange.\ntype OAuthExchangeResult =\n | { kind: 'authenticated'; accessToken: string; user: User }\n | { kind: 'requires2FA'; challengeToken: string };\nconst oauthExchangeCache = new Map<string, Promise<OAuthExchangeResult | null>>();\n\ninterface ForgeConnectProviderProps {\n config: ForgeConnectConfig;\n children: ReactNode;\n /** Called when user successfully authenticates */\n onLogin?: (user: User) => void;\n /** Called when user logs out */\n onLogout?: () => void;\n /** Pass `useWallet()` from @solana/wallet-adapter-react to enable wallet login */\n walletAdapter?: WalletAdapterContext | null;\n}\n\nexport function ForgeConnectProvider({ config, children, onLogin, onLogout, walletAdapter }: ForgeConnectProviderProps) {\n const [auth, setAuth] = useState<AuthState>({\n status: 'loading',\n user: null,\n accessToken: null,\n });\n\n const [modal, setModal] = useState<ModalState>({\n isOpen: false,\n step: 'method-select',\n });\n\n const [accountModal, setAccountModal] = useState<AccountModalState>({ isOpen: false });\n const [linkModal, setLinkModal] = useState<LinkModalState>({ isOpen: false });\n const [challengeToken, setChallengeToken] = useState<string | null>(null);\n\n const apiRef = useRef(createApiClient(config.apiUrl));\n const refreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const api = apiRef.current;\n\n // ── Token Refresh Scheduling ──\n\n const scheduleRefresh = useCallback((token: string) => {\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n const delay = getRefreshDelay(token);\n if (delay === null) return;\n\n refreshTimerRef.current = setTimeout(async () => {\n try {\n const { accessToken } = await api.refresh();\n setAuth((prev) => ({ ...prev, accessToken }));\n scheduleRefresh(accessToken);\n } catch {\n // Refresh failed — log user out\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n }\n }, delay);\n }, [api]);\n\n // ── Initialize from refresh cookie ──\n\n useEffect(() => {\n const init = async () => {\n try {\n const { accessToken } = await api.refresh();\n const user = await api.getMe(accessToken);\n setAuth({ status: 'authenticated', user, accessToken });\n scheduleRefresh(accessToken);\n } catch {\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n }\n };\n init();\n\n return () => {\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n };\n }, [api, scheduleRefresh]);\n\n // ── OAuth popup/callback handler ──\n\n useEffect(() => {\n // Check if THIS window is the OAuth callback popup\n if (window.location.pathname === '/fc-oauth-callback') {\n const params = new URLSearchParams(window.location.search);\n\n // Link callback — no token, just success flag\n if (params.get('fc_link_success') && window.opener) {\n window.opener.postMessage(\n { type: 'fc_oauth_link_success', provider: params.get('fc_provider') },\n window.location.origin,\n );\n window.close();\n return;\n }\n\n // Auth code callback — exchange code for tokens (prevents token leakage in URLs)\n const authCode = params.get('fc_code');\n if (authCode) {\n // Drop the code in localStorage as a fallback channel. The parent always picks it up\n // on next render even if the postMessage missed (StrictMode unmount window, popup\n // closed before parent listener registered, etc.).\n try {\n localStorage.setItem('fc_oauth_code_pending', authCode);\n } catch {\n // ignore (Safari private mode etc.)\n }\n if (window.opener) {\n window.opener.postMessage(\n { type: 'fc_oauth_code', code: authCode },\n window.location.origin,\n );\n }\n window.close();\n return;\n }\n }\n\n const handleCode = async (code: string) => {\n // Look up or start the exchange. Each code maps to a single shared promise.\n let exchangePromise = oauthExchangeCache.get(code);\n if (!exchangePromise) {\n try {\n localStorage.removeItem('fc_oauth_code_pending');\n } catch { /* ignore */ }\n exchangePromise = (async (): Promise<OAuthExchangeResult | null> => {\n try {\n const result = await api.exchangeOAuthCode(code);\n if (result.requires2FA && result.challengeToken) {\n return { kind: 'requires2FA', challengeToken: result.challengeToken };\n }\n const token = result.accessToken;\n if (!token) return null;\n const user = await api.getMe(token);\n return { kind: 'authenticated', accessToken: token, user };\n } catch {\n return null;\n }\n })();\n oauthExchangeCache.set(code, exchangePromise);\n }\n\n const outcome = await exchangePromise;\n if (!outcome) return;\n\n if (outcome.kind === 'requires2FA') {\n setChallengeToken(outcome.challengeToken);\n setModal({ isOpen: true, step: 'verify-2fa' });\n return;\n }\n\n setModal({ isOpen: true, step: 'success' });\n setAuth({ status: 'authenticated', user: outcome.user, accessToken: outcome.accessToken });\n scheduleRefresh(outcome.accessToken);\n onLogin?.(outcome.user);\n setTimeout(() => {\n setModal({ isOpen: false, step: 'method-select' });\n }, 1500);\n };\n\n // Listen for messages from OAuth popup\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) return;\n if (event.data?.type !== 'fc_oauth_code') return;\n const code = event.data.code as string;\n if (!code) return;\n void handleCode(code);\n };\n\n // Fallback: listen for the popup's localStorage write (fires in this window too on same-origin)\n const handleStorage = (event: StorageEvent) => {\n if (event.key !== 'fc_oauth_code_pending' || !event.newValue) return;\n void handleCode(event.newValue);\n };\n\n // Sweep: on mount, pick up any code the popup may have left behind before the listener attached\n try {\n const pending = localStorage.getItem('fc_oauth_code_pending');\n if (pending) void handleCode(pending);\n } catch { /* ignore */ }\n\n window.addEventListener('message', handleMessage);\n window.addEventListener('storage', handleStorage);\n return () => {\n window.removeEventListener('message', handleMessage);\n window.removeEventListener('storage', handleStorage);\n };\n }, [api, config.apiUrl, scheduleRefresh, onLogin]);\n\n // ── Legacy config warning ──\n\n useEffect(() => {\n if (config.loginMethods && config.loginMethods.length > 0) {\n const hasLegacy = config.oauthProviders || config.walletLogin !== undefined || config.passwordlessLogin !== undefined;\n if (hasLegacy) {\n console.warn(\n '[ForgeConnect] Both loginMethods and legacy fields (oauthProviders, walletLogin, passwordlessLogin) are set. loginMethods takes precedence.',\n );\n }\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── Auth Actions ──\n\n const handleAuthSuccess = useCallback(\n async (token: string) => {\n const user = await api.getMe(token);\n setAuth({ status: 'authenticated', user, accessToken: token });\n scheduleRefresh(token);\n // Show success screen, then auto-close\n setModal({ isOpen: true, step: 'success' });\n onLogin?.(user);\n setTimeout(() => {\n setModal({ isOpen: false, step: 'method-select' });\n }, 1500);\n },\n [api, scheduleRefresh, onLogin],\n );\n\n const loginWithEmail = useCallback(\n async (email: string, password: string) => {\n const res = await api.login(email, password);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const register = useCallback(\n async (email: string, password: string, displayName?: string) => {\n await api.register(email, password, displayName);\n // Registration sends verification email, no token returned\n },\n [api],\n );\n\n const sendOtp = useCallback(\n async (email: string) => {\n await api.sendOtp(email);\n },\n [api],\n );\n\n const verifyOtp = useCallback(\n async (email: string, code: string) => {\n const res = await api.verifyOtp(email, code);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const loginWithWallet = useCallback(\n async (\n walletAddress: string,\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined,\n chain: string = 'solana',\n signTransaction?: (txBase64: string) => Promise<string>,\n ) => {\n // If signMessage is available, use the standard message-signing flow\n if (signMessage) {\n const { challengeId, message: challengeMessage } = await api.walletChallenge(walletAddress, chain);\n const message = new TextEncoder().encode(challengeMessage);\n const signatureBytes = await signMessage(message);\n const signature = chain === 'solana'\n ? uint8ArrayToBase58(signatureBytes)\n : Array.from(signatureBytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n const res = await api.walletVerify(challengeId, signature, walletAddress);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n return;\n }\n\n // Fallback: transaction-based signing (hardware wallets)\n if (!signTransaction) {\n throw new Error('Wallet does not support message signing or transaction signing.');\n }\n\n const { challengeId, transaction: txBase64 } = await api.walletChallengeTx(walletAddress, chain);\n const signedTxBase64 = await signTransaction(txBase64);\n\n const res = await api.walletVerifyTx(challengeId, signedTxBase64, walletAddress);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const loginWithOAuth = useCallback(\n (provider: string) => {\n const callbackUrl = `${config.apiUrl}/auth/oauth/${provider}`;\n const redirectUri = encodeURIComponent(window.location.origin + '/fc-oauth-callback');\n const url = `${callbackUrl}?redirect_uri=${redirectUri}`;\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.innerWidth - width) / 2;\n const top = window.screenY + (window.innerHeight - height) / 2;\n const popup = window.open(url, 'fc_oauth', `width=${width},height=${height},left=${left},top=${top}`);\n setModal({ isOpen: true, step: 'oauth' });\n\n // Poll for popup close — revert to method-select if user closes it\n if (popup) {\n const poll = setInterval(() => {\n if (popup.closed) {\n clearInterval(poll);\n setModal((prev) => prev.step === 'oauth' ? { isOpen: true, step: 'method-select' } : prev);\n }\n }, 500);\n }\n },\n [config.apiUrl],\n );\n\n const logout = useCallback(async () => {\n const token = auth.accessToken;\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n onLogout?.();\n if (token) {\n try {\n await api.logout(token);\n } catch {\n // Already logged out client-side\n }\n }\n }, [auth.accessToken, api, onLogout]);\n\n const forgotPassword = useCallback(\n async (email: string) => {\n await api.forgotPassword(email);\n },\n [api],\n );\n\n const resetPassword = useCallback(\n async (token: string, password: string) => {\n await api.resetPassword(token, password);\n },\n [api],\n );\n\n const verifyEmailToken = useCallback(\n async (token: string) => {\n const res = await api.verifyEmailToken(token);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal({ isOpen: true, step: 'verify-2fa' });\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const loginWithPasskey = useCallback(async () => {\n const { options, challengeKey } = await api.getPasskeyLoginOptions(config.webauthnRpId);\n const authResponse = await startAuthentication({ optionsJSON: options });\n const { accessToken } = await api.verifyPasskeyLogin(challengeKey, authResponse, config.webauthnRpId, config.webauthnOrigin);\n await handleAuthSuccess(accessToken);\n }, [api, handleAuthSuccess, config.webauthnRpId, config.webauthnOrigin]);\n\n const verify2FA = useCallback(async (code: string) => {\n if (!challengeToken) throw new Error('No 2FA challenge active');\n const { accessToken } = await api.verify2FA(challengeToken, code);\n setChallengeToken(null);\n await handleAuthSuccess(accessToken);\n }, [api, challengeToken, handleAuthSuccess]);\n\n const verifyRecoveryCode = useCallback(async (code: string) => {\n if (!challengeToken) throw new Error('No 2FA challenge active');\n const { accessToken } = await api.verifyRecoveryCode(challengeToken, code);\n setChallengeToken(null);\n await handleAuthSuccess(accessToken);\n }, [api, challengeToken, handleAuthSuccess]);\n\n const logoutAll = useCallback(async () => {\n const token = auth.accessToken;\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n onLogout?.();\n if (token) {\n try {\n await api.logoutAll(token);\n } catch {\n // Already logged out client-side\n }\n }\n }, [auth.accessToken, api, onLogout]);\n\n // ── Modal Actions ──\n\n const openModal = useCallback(() => {\n const methods = resolveLoginMethods(config);\n\n // Single OAuth method — fire popup directly, skip modal\n if (methods.length === 1 && isOAuthMethod(methods[0])) {\n loginWithOAuth(methods[0]);\n return;\n }\n\n // Default OAuth method — fire popup directly\n if (config.defaultLoginMethod && isOAuthMethod(config.defaultLoginMethod) && methods.includes(config.defaultLoginMethod)) {\n loginWithOAuth(config.defaultLoginMethod);\n return;\n }\n\n const step = resolveInitialStep(config, methods);\n setModal({ isOpen: true, step });\n }, [config, loginWithOAuth]);\n\n const closeModal = useCallback(() => {\n setModal({ isOpen: false, step: 'method-select' });\n }, []);\n\n const setModalStep = useCallback((step: ModalStep) => {\n setModal((prev) => ({ ...prev, step }));\n }, []);\n\n const openAccountModal = useCallback(() => {\n setAccountModal({ isOpen: true });\n }, []);\n\n const closeAccountModal = useCallback(() => {\n setAccountModal({ isOpen: false });\n }, []);\n\n const openLinkModal = useCallback((mode?: 'auth' | 'wallet') => {\n setLinkModal({ isOpen: true, mode: mode ?? 'auth' });\n }, []);\n\n const closeLinkModal = useCallback(() => {\n setLinkModal({ isOpen: false });\n }, []);\n\n const getAccessToken = useCallback(() => auth.accessToken, [auth.accessToken]);\n\n // ── Context Value (memoized to avoid unnecessary re-renders) ──\n\n const value: ForgeConnectContextValue = useMemo(() => ({\n auth,\n modal,\n config,\n api,\n loginWithEmail,\n register,\n sendOtp,\n verifyOtp,\n loginWithWallet,\n loginWithOAuth,\n loginWithPasskey,\n logout,\n logoutAll,\n forgotPassword,\n resetPassword,\n verifyEmailToken,\n challengeToken,\n verify2FA,\n verifyRecoveryCode,\n openModal,\n closeModal,\n setModalStep,\n accountModal,\n openAccountModal,\n closeAccountModal,\n linkModal,\n openLinkModal,\n closeLinkModal,\n getAccessToken,\n walletAdapter: walletAdapter ?? null,\n }), [\n auth, modal, config, api, challengeToken, accountModal, linkModal,\n loginWithEmail, register, sendOtp, verifyOtp, loginWithWallet,\n loginWithOAuth, loginWithPasskey, logout, logoutAll, forgotPassword,\n resetPassword, verifyEmailToken, verify2FA, verifyRecoveryCode,\n openModal, closeModal, setModalStep, openAccountModal, closeAccountModal,\n openLinkModal, closeLinkModal, getAccessToken, walletAdapter,\n ]);\n\n return (\n <ForgeConnectContext.Provider value={value}>\n {children}\n <LoginModal />\n <AccountModal />\n <LinkAuthModal />\n </ForgeConnectContext.Provider>\n );\n}\n\n","import { createContext } from 'react';\nimport type { AuthState, ModalState, AccountModalState, LinkModalState, ForgeConnectConfig } from './types';\nimport type { ApiClient } from './api/client';\n\nexport interface ForgeConnectContextValue {\n // State\n auth: AuthState;\n modal: ModalState;\n config: ForgeConnectConfig;\n api: ApiClient;\n\n // Auth actions\n loginWithEmail: (email: string, password: string) => Promise<void>;\n register: (email: string, password: string, displayName?: string) => Promise<void>;\n sendOtp: (email: string) => Promise<void>;\n verifyOtp: (email: string, code: string) => Promise<void>;\n loginWithWallet: (walletAddress: string, signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined, chain?: string, signTransaction?: (txBase64: string) => Promise<string>) => Promise<void>;\n loginWithOAuth: (provider: string) => void;\n loginWithPasskey: () => Promise<void>;\n logout: () => Promise<void>;\n logoutAll: () => Promise<void>;\n forgotPassword: (email: string) => Promise<void>;\n resetPassword: (token: string, password: string) => Promise<void>;\n verifyEmailToken: (token: string) => Promise<void>;\n\n // 2FA\n challengeToken: string | null;\n verify2FA: (code: string) => Promise<void>;\n verifyRecoveryCode: (code: string) => Promise<void>;\n\n // Modal actions\n openModal: () => void;\n closeModal: () => void;\n setModalStep: (step: ModalState['step']) => void;\n\n // Account modal\n accountModal: AccountModalState;\n openAccountModal: () => void;\n closeAccountModal: () => void;\n\n // Link modal\n linkModal: LinkModalState;\n openLinkModal: (mode?: 'auth' | 'wallet') => void;\n closeLinkModal: () => void;\n\n // Token\n getAccessToken: () => string | null;\n\n // Wallet adapter (optional, injected by consumer)\n walletAdapter: WalletAdapterContext | null;\n}\n\nexport interface WalletAdapterContext {\n publicKey: { toBase58(): string } | null;\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined;\n signTransaction: ((transaction: any) => Promise<any>) | undefined;\n wallets: Array<{ adapter: { name: string; icon: string; connected: boolean; publicKey?: { toBase58(): string } | null }; readyState: string }>;\n select: (name: string) => void;\n connect: () => Promise<void>;\n}\n\nexport const ForgeConnectContext = createContext<ForgeConnectContextValue | null>(null);\n","import type { ApiErrorBody, User, AdminUser, Session, PaginatedResponse, UserStatus, TokenVerificationResult, WalletUserResult, TotpSetup, Passkey, Role, RoleUser, UserRoleAssignment, PermissionDomains } from '../types';\n\nexport class ForgeConnectApiError extends Error {\n public readonly status: number;\n public readonly code: string;\n\n constructor(status: number, code: string, message: string) {\n super(message);\n this.name = 'ForgeConnectApiError';\n this.status = status;\n this.code = code;\n }\n}\n\n// Module-level cache so StrictMode double-mount (or multiple provider instances pointing at the\n// same API) shares the same dedup singletons. Without this, each new client has its own\n// `inflightRefresh` and concurrent refreshes trip the server's reuse detection.\nconst clientCache = new Map<string, ReturnType<typeof buildApiClient>>();\n\nexport function createApiClient(apiUrl: string) {\n const base = apiUrl.replace(/\\/+$/, '');\n const cached = clientCache.get(base);\n if (cached) return cached;\n const client = buildApiClient(base);\n clientCache.set(base, client);\n return client;\n}\n\nfunction buildApiClient(base: string) {\n // Request deduplication: prevents duplicate concurrent requests\n const inflightRequests = new Map<string, Promise<any>>();\n\n // Singleton refresh promise — prevents concurrent refresh token rotation\n // which triggers reuse detection and revokes all sessions\n let inflightRefresh: Promise<any> | null = null;\n\n async function request<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n token?: string | null;\n } = {},\n ): Promise<T> {\n const { method = 'GET', body, token } = options;\n\n // Deduplicate concurrent refresh calls (critical: refresh rotates the token,\n // a second concurrent call with the old token triggers reuse detection)\n if (method === 'POST' && path === '/auth/refresh') {\n if (inflightRefresh) return inflightRefresh as Promise<T>;\n inflightRefresh = doRequest<T>(path, options).finally(() => {\n inflightRefresh = null;\n });\n return inflightRefresh as Promise<T>;\n }\n\n // Deduplicate identical concurrent GET requests\n if (method === 'GET' && token) {\n const dedupKey = `${path}:${token}`;\n const inflight = inflightRequests.get(dedupKey);\n if (inflight) return inflight as Promise<T>;\n const promise = doRequest<T>(path, options).finally(() => {\n inflightRequests.delete(dedupKey);\n });\n inflightRequests.set(dedupKey, promise);\n return promise;\n }\n\n return doRequest<T>(path, options);\n }\n\n async function doRequest<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n token?: string | null;\n } = {},\n ): Promise<T> {\n const { method = 'GET', body, token } = options;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const res = await fetch(`${base}${path}`, {\n method,\n headers,\n credentials: 'include',\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: ApiErrorBody;\n try {\n errorBody = await res.json() as ApiErrorBody;\n } catch {\n throw new ForgeConnectApiError(res.status, 'UNKNOWN', res.statusText);\n }\n throw new ForgeConnectApiError(res.status, errorBody.error.code, errorBody.error.message);\n }\n\n return res.json() as Promise<T>;\n }\n\n async function serviceRequest<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n serviceKey: string;\n },\n ): Promise<T> {\n const { method = 'GET', body, serviceKey } = options;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-service-key': serviceKey,\n };\n\n const res = await fetch(`${base}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: ApiErrorBody;\n try {\n errorBody = await res.json() as ApiErrorBody;\n } catch {\n throw new ForgeConnectApiError(res.status, 'UNKNOWN', res.statusText);\n }\n throw new ForgeConnectApiError(res.status, errorBody.error.code, errorBody.error.message);\n }\n\n return res.json() as Promise<T>;\n }\n\n return {\n // ── Auth: Email ──\n register(email: string, password: string, displayName?: string) {\n return request<{ success: true }>('/auth/email/register', {\n method: 'POST',\n body: { email, password, displayName },\n });\n },\n\n login(email: string, password: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string; user?: { id: string; displayName: string | null; email: string } }>(\n '/auth/email/login',\n { method: 'POST', body: { email, password } },\n );\n },\n\n sendOtp(email: string) {\n return request<{ success: true }>('/auth/email/send-code', {\n method: 'POST',\n body: { email },\n });\n },\n\n verifyOtp(email: string, code: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string; user?: { id: string; email: string } }>(\n '/auth/email/verify-code',\n { method: 'POST', body: { email, code } },\n );\n },\n\n // ── Auth: Wallet ──\n walletChallenge(walletAddress: string, chain: string = 'solana') {\n return request<{ challengeId: string; message: string }>('/auth/wallet/challenge', {\n method: 'POST',\n body: { walletAddress, chain },\n });\n },\n\n walletVerify(challengeId: string, signature: string, walletAddress: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string }>('/auth/wallet/verify', {\n method: 'POST',\n body: { challengeId, signature, walletAddress },\n });\n },\n\n walletChallengeTx(walletAddress: string, chain: string = 'solana') {\n return request<{ challengeId: string; transaction: string }>('/auth/wallet/challenge-tx', {\n method: 'POST',\n body: { walletAddress, chain },\n });\n },\n\n walletVerifyTx(challengeId: string, signedTransaction: string, walletAddress: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string }>('/auth/wallet/verify-tx', {\n method: 'POST',\n body: { challengeId, signedTransaction, walletAddress },\n });\n },\n\n // ── Auth: OAuth ──\n exchangeOAuthCode(code: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string; userId?: string }>('/auth/oauth/exchange', {\n method: 'POST',\n body: { code },\n });\n },\n\n createLinkIntent(token: string) {\n return request<{ intentToken: string }>('/auth/oauth/link-intent', {\n method: 'POST',\n token,\n });\n },\n\n // ── Auth: Session ──\n refresh() {\n return request<{ accessToken: string }>('/auth/refresh', { method: 'POST' });\n },\n\n logout(token: string) {\n return request<{ success: true }>('/auth/logout', { method: 'POST', token });\n },\n\n logoutAll(token: string) {\n return request<{ success: true }>('/auth/logout-all', { method: 'POST', token });\n },\n\n // ── User ──\n getMe(token: string) {\n return request<{ id: string; displayName: string | null; avatarUrl: string | null; primaryEmail: string | null; status: string; createdAt: string; updatedAt: string }>(\n '/users/me',\n { token },\n );\n },\n\n updateMe(token: string, data: { displayName?: string; avatarUrl?: string }) {\n return request<{ id: string; displayName: string | null; avatarUrl: string | null; primaryEmail: string | null; status: string; createdAt: string; updatedAt: string }>(\n '/users/me',\n { method: 'PATCH', token, body: data },\n );\n },\n\n setPassword(token: string, newPassword: string, currentPassword?: string) {\n return request<{ success: true }>('/users/me/password', {\n method: 'POST',\n token,\n body: { newPassword, ...(currentPassword ? { currentPassword } : {}) },\n });\n },\n\n getAuthMethods(token: string) {\n return request<Array<{ id: string; provider: string; providerId: string; providerUsername: string | null; isVerified: boolean; verifiedAt: string | null; createdAt: string }>>(\n '/users/me/auth-methods',\n { token },\n );\n },\n\n linkAuthMethod(token: string, data: { provider: string; email?: string; password?: string; challengeId?: string; signature?: string; signedTransaction?: string; walletAddress?: string }) {\n return request<{ success: true }>('/users/me/auth-methods', {\n method: 'POST',\n token,\n body: data,\n });\n },\n\n linkOtpSend(token: string, email: string) {\n return request<{ success: true }>('/users/me/auth-methods/otp/send', {\n method: 'POST',\n token,\n body: { email },\n });\n },\n\n linkOtpVerify(token: string, email: string, code: string) {\n return request<{ success: true }>('/users/me/auth-methods/otp/verify', {\n method: 'POST',\n token,\n body: { email, code },\n });\n },\n\n unlinkAuthMethod(token: string, id: string) {\n return request<{ success: true }>(`/users/me/auth-methods/${id}`, {\n method: 'DELETE',\n token,\n });\n },\n\n getWallets(token: string) {\n return request<Array<{ id: string; userId: string; chain: string; address: string; label: string | null; isPrimary: boolean; verifiedAt: string | null; lastUsedAt: string | null }>>(\n '/users/me/wallets',\n { token },\n );\n },\n\n updateWallet(token: string, id: string, data: { label?: string; isPrimary?: boolean }) {\n return request<{ id: string; userId: string; chain: string; address: string; label: string | null; isPrimary: boolean; verifiedAt: string | null; lastUsedAt: string | null }>(\n `/users/me/wallets/${id}`,\n { method: 'PATCH', token, body: data },\n );\n },\n\n getSessions(token: string) {\n return request<Array<{ id: string; createdAt: string; expiresAt: string; lastActiveAt: string; deviceInfo: Record<string, unknown> | null; ipAddress: string }>>(\n '/users/me/sessions',\n { token },\n );\n },\n\n revokeSession(token: string, id: string) {\n return request<{ success: true }>(`/users/me/sessions/${id}`, {\n method: 'DELETE',\n token,\n });\n },\n\n // ── Auth: Email Verification & Password Reset ──\n verifyEmailToken(token: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string }>('/auth/email/verify', {\n method: 'POST',\n body: { token },\n });\n },\n\n forgotPassword(email: string) {\n return request<{ success: true }>('/auth/email/forgot-password', {\n method: 'POST',\n body: { email },\n });\n },\n\n resetPassword(token: string, password: string) {\n return request<{ success: true }>('/auth/email/reset-password', {\n method: 'POST',\n body: { token, password },\n });\n },\n\n // ── 2FA ──\n get2FAStatus(token: string) {\n return request<{ enabled: boolean }>('/users/me/2fa/status', { token });\n },\n\n setup2FA(token: string) {\n return request<TotpSetup>('/users/me/2fa/setup', { method: 'POST', token });\n },\n\n enable2FA(token: string, code: string) {\n return request<{ success: true }>('/users/me/2fa/enable', { method: 'POST', token, body: { code } });\n },\n\n disable2FA(token: string, code: string) {\n return request<{ success: true }>('/users/me/2fa', { method: 'DELETE', token, body: { code } });\n },\n\n verify2FA(challengeToken: string, code: string) {\n return request<{ accessToken: string }>('/auth/2fa/verify', { method: 'POST', body: { challengeToken, code } });\n },\n\n verifyRecoveryCode(challengeToken: string, code: string) {\n return request<{ accessToken: string }>('/auth/2fa/verify-recovery', { method: 'POST', body: { challengeToken, code } });\n },\n\n regenerateRecoveryCodes(token: string, code: string) {\n return request<{ recoveryCodes: string[] }>('/users/me/2fa/recovery-codes', { method: 'POST', token, body: { code } });\n },\n\n // ── Passkeys ──\n getPasskeys(token: string) {\n return request<Passkey[]>('/users/me/passkeys', { token });\n },\n\n getPasskeyRegisterOptions(token: string, rpId?: string, origin?: string) {\n return request<{ options: any; challengeKey: string }>('/auth/passkeys/register/options', { method: 'POST', token, body: { rpId, origin } });\n },\n\n verifyPasskeyRegistration(token: string, challengeKey: string, response: any, name?: string, rpId?: string, origin?: string) {\n return request<Passkey>('/auth/passkeys/register/verify', { method: 'POST', token, body: { challengeKey, response, name, rpId, origin } });\n },\n\n getPasskeyLoginOptions(rpId?: string) {\n return request<{ options: any; challengeKey: string }>('/auth/passkeys/login/options', { method: 'POST', body: { rpId } });\n },\n\n verifyPasskeyLogin(challengeKey: string, response: any, rpId?: string, origin?: string) {\n return request<{ accessToken: string }>('/auth/passkeys/login/verify', { method: 'POST', body: { challengeKey, response, rpId, origin } });\n },\n\n renamePasskey(token: string, id: string, name: string) {\n return request<Passkey>(`/users/me/passkeys/${id}`, { method: 'PATCH', token, body: { name } });\n },\n\n deletePasskey(token: string, id: string) {\n return request<{ success: true }>(`/users/me/passkeys/${id}`, { method: 'DELETE', token });\n },\n\n // ── Account Deletion ──\n requestAccountDeletion(token: string) {\n return request<{ requiresVerification: boolean }>('/users/me/delete-request', {\n method: 'POST',\n token,\n });\n },\n\n confirmAccountDeletion(token: string, code?: string) {\n return request<{ success: true }>('/users/me/delete-confirm', {\n method: 'POST',\n token,\n body: code ? { code } : {},\n });\n },\n\n // ── Admin ──\n adminListUsers(token: string, params?: { page?: number; limit?: number; search?: string }) {\n const query = new URLSearchParams();\n if (params?.page) query.set('page', String(params.page));\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.search) query.set('search', params.search);\n const qs = query.toString();\n return request<PaginatedResponse<User>>(`/admin/users${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminGetUser(token: string, id: string) {\n return request<AdminUser>(`/admin/users/${id}`, { token });\n },\n\n adminUpdateUserStatus(token: string, id: string, status: UserStatus) {\n return request<{ success: true }>(`/admin/users/${id}/status`, {\n method: 'PATCH',\n token,\n body: { status },\n });\n },\n\n adminGetUserSessions(token: string, id: string) {\n return request<Session[]>(`/admin/users/${id}/sessions`, { token });\n },\n\n adminRevokeUserSessions(token: string, id: string) {\n return request<{ success: true }>(`/admin/users/${id}/sessions`, {\n method: 'DELETE',\n token,\n });\n },\n\n // ── Roles ──\n adminListRoles(token: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ data: Role[] }>(`/admin/roles${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminGetRole(token: string, id: string) {\n return request<Role>(`/admin/roles/${id}`, { token });\n },\n\n adminGetRoleUsers(token: string, id: string) {\n return request<{ data: RoleUser[] }>(`/admin/roles/${id}/users`, { token });\n },\n\n adminCreateRole(token: string, data: { name: string; description?: string; permissions: string[]; tenantId?: string }) {\n return request<Role>('/admin/roles', { method: 'POST', token, body: data });\n },\n\n adminUpdateRole(token: string, id: string, data: { name?: string; description?: string; permissions?: string[] }) {\n return request<Role>(`/admin/roles/${id}`, { method: 'PATCH', token, body: data });\n },\n\n adminDeleteRole(token: string, id: string) {\n return request<{ success: true }>(`/admin/roles/${id}`, { method: 'DELETE', token });\n },\n\n adminGetPermissions(token: string) {\n return request<{ domains: PermissionDomains }>('/admin/roles/permissions', { token });\n },\n\n /** Get the current user's own roles (no admin privileges needed). */\n getMyRoles(token: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ data: UserRoleAssignment[]; permissions: string[] }>(`/users/me/roles${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminGetUserRoles(token: string, userId: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ data: UserRoleAssignment[] }>(`/admin/users/${userId}/roles${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminAssignRole(token: string, userId: string, roleId: string, tenantId?: string) {\n return request<{ success: true }>(`/admin/users/${userId}/roles`, {\n method: 'POST',\n token,\n body: { roleId, ...(tenantId ? { tenantId } : {}) },\n });\n },\n\n adminRevokeRole(token: string, userId: string, roleId: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ success: true }>(`/admin/users/${userId}/roles/${roleId}${qs ? `?${qs}` : ''}`, {\n method: 'DELETE',\n token,\n });\n },\n\n // ── Service ──\n serviceVerifyToken(serviceKey: string, accessToken: string, tenantId?: string) {\n return serviceRequest<TokenVerificationResult>('/service/verify-token', {\n method: 'POST',\n serviceKey,\n body: { token: accessToken, ...(tenantId ? { tenantId } : {}) },\n });\n },\n\n serviceUserByWallet(serviceKey: string, walletAddress: string, chain?: string) {\n return serviceRequest<WalletUserResult>('/service/user-by-wallet', {\n method: 'POST',\n serviceKey,\n body: { walletAddress, chain },\n });\n },\n };\n}\n\nexport type ApiClient = ReturnType<typeof createApiClient>;\n","interface DecodedJWT {\n sub: string;\n tid?: string;\n scopes: string[];\n iat?: number;\n exp?: number;\n}\n\nexport function decodeJWT(token: string): DecodedJWT | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const payload = JSON.parse(atob(parts[1].replace(/-/g, '+').replace(/_/g, '/')));\n return payload as DecodedJWT;\n } catch {\n return null;\n }\n}\n\n/**\n * Returns milliseconds until 80% of the token's TTL has elapsed.\n * Returns null if the token cannot be decoded or has no exp.\n */\nexport function getRefreshDelay(token: string): number | null {\n const decoded = decodeJWT(token);\n if (!decoded?.exp || !decoded.iat) return null;\n const ttl = (decoded.exp - decoded.iat) * 1000;\n const elapsed = Date.now() - decoded.iat * 1000;\n const delay = ttl * 0.8 - elapsed;\n return delay > 0 ? delay : 0;\n}\n","import { useState, type ReactNode } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { EmailLoginForm, EmailRegisterForm } from './tabs/email-password.js';\nimport { EmailOtpForm } from './tabs/email-otp.js';\nimport { WalletConnectForm } from './tabs/wallet-connect.js';\nimport { ForgotPasswordForm } from './tabs/forgot-password.js';\nimport { Verify2FAForm } from './tabs/verify-2fa.js';\nimport { OAuthButton } from './tabs/oauth-buttons.js';\nimport { SvgIcon } from './svg-icon.js';\nimport { resolveLoginMethods, isOAuthMethod } from '../resolve-config.js';\nimport type { LoginMethod } from '../types.js';\n\nexport function LoginModal() {\n const { modal, closeModal, config } = useForgeConnect();\n\n const renderStep = () => {\n switch (modal.step) {\n case 'email-login':\n return <EmailLoginForm />;\n case 'email-register':\n return <EmailRegisterForm />;\n case 'email-otp':\n return <EmailOtpForm />;\n case 'wallet-connect':\n return <WalletConnectForm />;\n case 'forgot-password':\n return <ForgotPasswordForm />;\n case 'verify-2fa':\n return <Verify2FAForm />;\n case 'oauth':\n return <OAuthLoadingView />;\n case 'success':\n return <SuccessView />;\n case 'method-select':\n default:\n return <MethodSelect />;\n }\n };\n\n const renderLogo = () => {\n if (config.appearance?.logoNode) {\n return <div className=\"fc-logo\">{config.appearance.logoNode as ReactNode}</div>;\n }\n if (config.appearance?.logo) {\n return <img src={config.appearance.logo} alt=\"\" className=\"fc-logo\" />;\n }\n return null;\n };\n\n return (\n <ModalOverlay isOpen={modal.isOpen} onClose={closeModal}>\n <div\n className=\"fc-modal-content\"\n style={{\n '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6',\n } as React.CSSProperties}\n data-theme={config.appearance?.theme ?? 'light'}\n >\n {modal.step === 'success' || modal.step === 'oauth' ? (\n renderStep()\n ) : (\n <>\n {renderLogo()}\n\n <h2 className=\"fc-modal-title\">\n {config.appearance?.title ?? 'Log in or sign up'}\n </h2>\n {renderStep()}\n {(config.appearance?.termsUrl || config.appearance?.privacyUrl) && (\n <p className=\"fc-legal\">\n By continuing, you agree to our{' '}\n {config.appearance.termsUrl && (\n <a href={config.appearance.termsUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"fc-legal-link\">Terms</a>\n )}\n {config.appearance.termsUrl && config.appearance.privacyUrl && ' and '}\n {config.appearance.privacyUrl && (\n <a href={config.appearance.privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"fc-legal-link\">Privacy Policy</a>\n )}\n </p>\n )}\n <NomuPill />\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n\n// ── Icons ──\n\nconst EmailIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\nconst OtpIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"3\" y=\"6\" width=\"14\" height=\"9\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"6.5\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"10\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"13.5\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" />\n </svg>\n </div>\n);\n\nconst WalletIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </div>\n);\n\nconst PasskeyIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <circle cx=\"8\" cy=\"7\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M13 13.5a5 5 0 0 0-10 0\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M15 10v4m0 0l-1.5-1m1.5 1l1.5-1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n);\n\nconst LoadingSpinner = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon fc-spin\">\n <path d=\"M10 2a8 8 0 0 1 8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\n// ── Method Select ──\n\nfunction MethodSelect() {\n const { setModalStep, loginWithPasskey, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const [passkeyLoading, setPasskeyLoading] = useState(false);\n const [passkeyError, setPasskeyError] = useState('');\n\n const handlePasskey = async () => {\n setPasskeyLoading(true);\n setPasskeyError('');\n try {\n await loginWithPasskey();\n } catch (err: unknown) {\n setPasskeyError(err instanceof Error ? err.message : 'Passkey authentication failed.');\n } finally {\n setPasskeyLoading(false);\n }\n };\n\n // Build elements in config order, grouping consecutive OAuth providers\n const elements: ReactNode[] = [];\n let i = 0;\n\n while (i < methods.length) {\n const method = methods[i];\n\n if (isOAuthMethod(method)) {\n // Collect consecutive OAuth providers\n const oauthGroup: LoginMethod[] = [];\n while (i < methods.length && isOAuthMethod(methods[i])) {\n oauthGroup.push(methods[i]);\n i++;\n }\n\n // Add divider before OAuth group if there were non-OAuth elements before\n if (elements.length > 0) {\n elements.push(<div key={`div-before-${oauthGroup[0]}`} className=\"fc-divider\"><span>or</span></div>);\n }\n\n elements.push(\n <div key={`oauth-${oauthGroup.join('-')}`} className=\"fc-oauth-group\">\n {oauthGroup.map((p) => (\n <OAuthButton key={p} provider={p as any} />\n ))}\n </div>,\n );\n } else {\n // Add divider after an OAuth group\n if (elements.length > 0) {\n const prev = methods[i - 1];\n if (prev && isOAuthMethod(prev)) {\n elements.push(<div key={`div-after-${prev}`} className=\"fc-divider\"><span>or</span></div>);\n }\n }\n\n switch (method) {\n case 'email':\n elements.push(\n <button key=\"email\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={() => setModalStep('email-login')}>\n <EmailIcon /> <span className=\"fc-btn-name\">Password</span>\n </button>,\n );\n break;\n case 'otp':\n elements.push(\n <button key=\"otp\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={() => setModalStep('email-otp')}>\n <OtpIcon /> <span className=\"fc-btn-name\">Magic code</span>\n </button>,\n );\n break;\n case 'wallet':\n elements.push(\n <button key=\"wallet\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={() => setModalStep('wallet-connect')}>\n <WalletIcon /> <span className=\"fc-btn-name\">Wallet</span>\n </button>,\n );\n break;\n case 'passkey':\n elements.push(\n <button key=\"passkey\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={handlePasskey} disabled={passkeyLoading}>\n {passkeyLoading ? <LoadingSpinner /> : <PasskeyIcon />}\n <span className=\"fc-btn-name\">{passkeyLoading ? 'Waiting for passkey...' : 'Passkey'}</span>\n </button>,\n );\n break;\n }\n i++;\n }\n }\n\n return (\n <div className=\"fc-method-select\">\n {passkeyError && <p className=\"fc-error\">{passkeyError}</p>}\n {elements}\n </div>\n );\n}\n\n// ── OAuth Loading View ──\n\nfunction OAuthLoadingView() {\n const { setModalStep } = useForgeConnect();\n\n return (\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg width=\"52\" height=\"52\" viewBox=\"0 0 52 52\" className=\"fc-spin\">\n <circle cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" stroke=\"var(--fc-accent, #8b5cf6)\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeDasharray=\"100\" strokeDashoffset=\"30\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Completing sign in...</p>\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" style={{ marginTop: '16px' }} onClick={() => setModalStep('method-select')}>\n Cancel\n </button>\n </div>\n );\n}\n\n// ── Nomu Trust Pill ──\n\nconst NOMU_LOGO = '<svg viewBox=\"0 0 466 115\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-label=\"Nomu\"><path d=\"M86.1037 1.64399C89.2226 2.96692 92.9067 6.05804 94.8954 8.90299C101.195 17.9195 103.263 31.5362 105.652 42.3487C108.921 57.1343 113.078 73.2835 111.843 88.981C111.25 96.5118 107.934 104.178 100.485 106.907C78.5857 114.928 68.4753 94.3605 55.5778 81.0755C54.0151 79.4657 49.9264 75.4498 48.017 74.7242C45.1699 73.6431 46.4243 77.2266 46.9038 78.6202C48.9075 84.4342 52.7842 89.1608 55.1111 94.4333C58.2322 101.506 56.3335 109.491 48.9353 112.563C38.6837 116.818 24.7051 108.932 18.1076 100.994C9.79754 90.9975 3.49328 72.2174 1.14497 59.3049C-1.5908 44.2668 -0.458383 24.9194 16.2003 18.5938C32.7091 12.3216 46.9723 35.7212 56.8964 45.2451C58.5169 46.8013 61.9677 50.9392 63.3912 46.949C64.6285 43.4833 63.6652 36.0102 63.4983 32.0543C62.9845 19.8418 61.3918 -1.3144 79.4334 0.0641835C81.3279 0.209749 84.3483 0.899043 86.1015 1.64399H86.1037Z\"/><path d=\"M198.265 10.0303C208.463 15.8037 214.843 26.2244 217.82 37.2467C220.237 46.1968 221.048 56.7482 219.807 66.1799C216.628 90.3223 200.149 109.849 174.493 110.988C157.695 111.733 139.746 105.682 131.472 90.1896C118.984 66.8071 137.597 43.8678 152.329 27.1128C164.501 13.2691 178.368 -1.23604 198.265 10.0303ZM175.364 41.9176C169.771 38.1072 164.25 44.1996 162.46 49.0803C159.339 57.5916 160.988 72.0346 172.766 71.1591C180.16 70.609 181.427 61.1108 181.02 55.2047C180.752 51.3451 178.7 44.1867 175.364 41.9155V41.9176Z\"/><path d=\"M324.975 3.83292C329.706 5.77236 335.978 13.6051 338.509 17.8479C348.347 34.3438 351.002 53.6547 350.321 73.0085C349.884 85.4008 348.086 102.122 337.415 109.993C321.938 121.407 304.25 107.993 308.199 89.9711C308.681 87.7705 309.725 85.6213 310.52 83.5555C311.913 79.9293 311.83 74.2415 310.92 70.2556C310.903 70.1807 310.614 69.4079 310.483 68.9476C309.62 65.8737 307.548 61.6908 303.712 63.5468C302.409 64.1783 300.839 66.2162 299.022 67.096C292.491 70.2577 283.616 65.5697 280.37 59.4559C279.444 57.707 277.958 52.7728 276.322 51.9444C274.342 50.9425 273.617 52.8948 273.09 54.4382C271.587 58.8437 271.701 66.5394 273.096 71.2232C273.957 74.1088 275.809 76.866 276.92 79.6103C281.115 89.9733 285.647 107.621 270.934 111.791C262.391 114.212 256.003 109.961 250.756 103.888C231.165 81.2072 230.598 47.9049 244.878 21.7289C250.014 12.3142 256.371 6.06777 268.012 6.30967C275.396 6.4638 279.829 10.469 283.241 16.5442C285.532 20.62 287.7 25.1582 290.905 28.7995C293.204 31.4111 296.462 34.0398 299.778 31.2077C303.727 27.8362 305.846 18.0876 308.505 13.2219C311.802 7.18948 317.203 0.649749 324.973 3.83292H324.975Z\"/><path d=\"M452.977 13.4681C459.921 19.2693 464.095 29.0907 465.288 37.8695C468.466 61.282 454.854 98.4611 432.55 109.468C421.31 115.015 406.192 112.904 394.569 109.445C375.919 103.894 364.978 87.4109 363.803 68.2841C362.775 51.5612 371.925 30.2787 381.817 17.15C388.977 7.64763 404.21 11.5072 408.836 21.3243C411.705 27.4124 409.059 30.8824 406.488 36.0436C430.727 62.0334 432.463 57.1377 431.208 47.5453C429.772 36.5723 421.213 13.8256 437.17 9.58065C442.973 8.03724 448.492 9.72193 452.977 13.4681Z\"/></svg>';\n\nfunction NomuPill() {\n return (\n <div className=\"fc-nomu-wrap\">\n <a\n href=\"https://www.nomu.dev/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"fc-nomu-pill\"\n >\n <span>Powered by</span>\n <SvgIcon svg={NOMU_LOGO} className=\"fc-nomu-logo\" />\n </a>\n </div>\n );\n}\n\n// ── Success View ──\n\nfunction SuccessView() {\n return (\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">You're in</p>\n </div>\n );\n}\n","import { useContext } from 'react';\nimport { ForgeConnectContext, type ForgeConnectContextValue } from '../context';\n\nexport function useForgeConnect(): ForgeConnectContextValue {\n const ctx = useContext(ForgeConnectContext);\n if (!ctx) {\n throw new Error('useForgeConnect must be used within a <ForgeConnectProvider>');\n }\n return ctx;\n}\n","import { useEffect, useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface ModalOverlayProps {\n isOpen: boolean;\n onClose: () => void;\n children: ReactNode;\n}\n\nexport function ModalOverlay({ isOpen, onClose, children }: ModalOverlayProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handleKeyDown);\n document.body.style.overflow = 'hidden';\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n // Only restore scroll if no other fc-overlay remains in the DOM\n if (!document.querySelector('.fc-overlay')) {\n document.body.style.overflow = '';\n }\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === overlayRef.current) onClose();\n };\n\n return createPortal(\n <div className=\"fc-overlay\" ref={overlayRef} onClick={handleBackdropClick}>\n <div className=\"fc-modal\" role=\"dialog\" aria-modal=\"true\">\n <button className=\"fc-modal-close\" onClick={onClose} aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n {children}\n </div>\n </div>,\n document.body,\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport { resolveLoginMethods } from '../../resolve-config.js';\n\nexport function EmailLoginForm() {\n const { loginWithEmail, setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await loginWithEmail(email, password);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Something went wrong. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Sign in with email</h3>\n <form onSubmit={handleSubmit} className=\"fc-form\">\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n <label className=\"fc-label\">\n Password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter your password\"\n required\n autoComplete=\"current-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Signing in...' : 'Sign in'}\n </button>\n </form>\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('forgot-password')}>\n Forgot password?\n </button>\n </p>\n <p className=\"fc-switch\">\n Don't have an account?{' '}\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('email-register')}>\n Sign up\n </button>\n </p>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n\nexport function EmailRegisterForm() {\n const { register, setModalStep } = useForgeConnect();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [displayName, setDisplayName] = useState('');\n const [error, setError] = useState('');\n const [success, setSuccess] = useState(false);\n const [loading, setLoading] = useState(false);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await register(email, password, displayName || undefined);\n setSuccess(true);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Something went wrong. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n if (success) {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Check your email</h3>\n <p className=\"fc-text\">We sent a verification link to <strong>{email}</strong>. Click it to activate your account, then sign in.</p>\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={() => setModalStep('email-login')}>\n Back to sign in\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Create an account</h3>\n <form onSubmit={handleSubmit} className=\"fc-form\">\n <label className=\"fc-label\">\n Display name\n <input\n type=\"text\"\n className=\"fc-input\"\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n placeholder=\"Your name\"\n autoComplete=\"name\"\n />\n </label>\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n <label className=\"fc-label\">\n Password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"8+ characters\"\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Creating account...' : 'Create account'}\n </button>\n </form>\n <p className=\"fc-switch\">\n Already have an account?{' '}\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('email-login')}>\n Sign in\n </button>\n </p>\n </div>\n );\n}\n","import type { ForgeConnectConfig, LoginMethod, ModalStep, OAuthProvider } from './types.js';\n\nconst OAUTH_PROVIDERS: ReadonlySet<string> = new Set(['google', 'discord', 'twitter', 'apple', 'telegram', 'matrica']);\n\n/** Check if a login method is an OAuth provider. */\nexport function isOAuthMethod(method: LoginMethod): method is OAuthProvider {\n return OAUTH_PROVIDERS.has(method);\n}\n\n/**\n * Resolve the effective ordered login methods from config.\n * If `loginMethods` is set, uses that directly.\n * Otherwise, falls back to legacy fields for backward compat.\n */\nexport function resolveLoginMethods(config: ForgeConnectConfig): LoginMethod[] {\n if (config.loginMethods && config.loginMethods.length > 0) {\n return config.loginMethods;\n }\n\n // Legacy resolution\n const methods: LoginMethod[] = [];\n\n if (config.oauthProviders) {\n for (const p of config.oauthProviders) {\n methods.push(p);\n }\n }\n\n methods.push('email');\n\n if (config.passwordlessLogin !== false) {\n methods.push('otp');\n }\n\n if (config.walletLogin !== false) {\n methods.push('wallet');\n }\n\n return methods;\n}\n\n/** Map a LoginMethod to the ModalStep it navigates to. */\nexport function loginMethodToStep(method: LoginMethod): ModalStep {\n switch (method) {\n case 'email': return 'email-login';\n case 'otp': return 'email-otp';\n case 'wallet': return 'wallet-connect';\n case 'passkey': return 'method-select'; // Passkey triggers browser API directly\n default: return 'method-select'; // OAuth methods handled specially\n }\n}\n\n/**\n * Determine the initial modal step when opened.\n * - If only 1 method and it's not OAuth, go directly to that step.\n * - If `defaultLoginMethod` is set (and valid), go to that step.\n * - Otherwise, show method-select.\n */\nexport function resolveInitialStep(config: ForgeConnectConfig, methods: LoginMethod[]): ModalStep {\n // Single method — skip method-select\n if (methods.length === 1 && !isOAuthMethod(methods[0])) {\n return loginMethodToStep(methods[0]);\n }\n\n const defaultMethod = config.defaultLoginMethod;\n if (!defaultMethod || !methods.includes(defaultMethod)) {\n return 'method-select';\n }\n\n if (isOAuthMethod(defaultMethod)) {\n return 'method-select'; // OAuth default handled in openModal by firing popup\n }\n\n return loginMethodToStep(defaultMethod);\n}\n","import { useState, useRef, type FormEvent, type KeyboardEvent, type ClipboardEvent } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport { resolveLoginMethods } from '../../resolve-config.js';\n\nexport function EmailOtpForm() {\n const { sendOtp, verifyOtp, setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const [email, setEmail] = useState('');\n const [code, setCode] = useState(['', '', '', '', '', '']);\n const [step, setStep] = useState<'email' | 'code'>('email');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n const handleSendCode = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await sendOtp(email);\n setStep('code');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not send the code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerify = async (digits: string[]) => {\n const codeStr = digits.join('');\n if (codeStr.length !== 6) return;\n setError('');\n setLoading(true);\n try {\n await verifyOtp(email, codeStr);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'This code is incorrect. Please check and try again.');\n setLoading(false);\n }\n };\n\n const handleDigitChange = (index: number, value: string) => {\n if (!/^\\d*$/.test(value)) return;\n const digit = value.slice(-1);\n const newCode = [...code];\n newCode[index] = digit;\n setCode(newCode);\n\n if (digit && index < 5) {\n inputRefs.current[index + 1]?.focus();\n }\n\n if (newCode.every((d) => d !== '')) {\n handleVerify(newCode);\n }\n };\n\n const handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && !code[index] && index > 0) {\n inputRefs.current[index - 1]?.focus();\n }\n };\n\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, 6);\n if (!pasted) return;\n const newCode = [...code];\n for (let i = 0; i < pasted.length; i++) {\n newCode[i] = pasted[i];\n }\n setCode(newCode);\n if (newCode.every((d) => d !== '')) {\n handleVerify(newCode);\n }\n };\n\n if (step === 'email') {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Passwordless sign in</h3>\n <form onSubmit={handleSendCode} className=\"fc-form\">\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Sending...' : 'Send code'}\n </button>\n </form>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Enter verification code</h3>\n <p className=\"fc-text\">We sent a 6-digit code to <strong>{email}</strong></p>\n <div className=\"fc-otp-inputs\">\n {code.map((digit, i) => (\n <input\n key={i}\n ref={(el) => { inputRefs.current[i] = el; }}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n className=\"fc-otp-digit\"\n value={digit}\n onChange={(e) => handleDigitChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={i === 0 ? handlePaste : undefined}\n autoFocus={i === 0}\n />\n ))}\n </div>\n {error && <p className=\"fc-error\">{error}</p>}\n {loading && <p className=\"fc-text\">Verifying...</p>}\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => { setStep('email'); setCode(['', '', '', '', '', '']); setError(''); }}>\n Use a different email\n </button>\n </p>\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport { resolveLoginMethods } from '../../resolve-config.js';\nimport { PROVIDER_INFO } from './oauth-buttons.js';\nimport { SvgIcon } from '../svg-icon.js';\n\n/** Inline \"Sign in with Matrica\" entry shown in the wallet list (brings wallets in).\n * Uses the OAuth-style icon class so it renders identically to the Matrica button in the main list. */\nfunction MatricaWalletEntry() {\n const { loginWithOAuth } = useForgeConnect();\n const info = PROVIDER_INFO.matrica;\n return (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => loginWithOAuth('matrica')}\n >\n <SvgIcon svg={info.icon} className=\"fc-oauth-icon\" />\n <span className=\"fc-wallet-name\">{info.label}</span>\n <span className=\"fc-badge-preferred\">Brings wallets</span>\n </button>\n );\n}\n\n// ── Mobile wallet deep links ──\n\nexport interface MobileWallet {\n name: string;\n icon: string;\n /** Build a universal link that opens the wallet app with the dApp URL in its in-app browser */\n buildUrl: (pageUrl: string) => string;\n}\n\nexport const MOBILE_WALLETS: MobileWallet[] = [\n {\n name: 'Phantom',\n icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTA4IiBoZWlnaHQ9IjEwOCIgdmlld0JveD0iMCAwIDEwOCAxMDgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMDgiIGhlaWdodD0iMTA4IiByeD0iMjYiIGZpbGw9IiNBQjlGRjIiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00Ni41MjY3IDY5LjkyMjlDNDIuMDA1NCA3Ni44NTA5IDM0LjQyOTIgODUuNjE4MiAyNC4zNDggODUuNjE4MkMxOS41ODI0IDg1LjYxODIgMTUgODMuNjU2MyAxNSA3NS4xMzQyQzE1IDUzLjQzMDUgNDQuNjMyNiAxOS44MzI3IDcyLjEyNjggMTkuODMyN0M4Ny43NjggMTkuODMyNyA5NCAzMC42ODQ2IDk0IDQzLjAwNzlDOTQgNTguODI1OCA4My43MzU1IDc2LjkxMjIgNzMuNTMyMSA3Ni45MTIyQzcwLjI5MzkgNzYuOTEyMiA2OC43MDUzIDc1LjEzNDIgNjguNzA1MyA3Mi4zMTRDNjguNzA1MyA3MS41NzgzIDY4LjgyNzUgNzAuNzgxMiA2OS4wNzE5IDY5LjkyMjlDNjUuNTg5MyA3NS44Njk5IDU4Ljg2ODUgODEuMzg3OCA1Mi41NzU0IDgxLjM4NzhDNDcuOTkzIDgxLjM4NzggNDUuNjcxMyA3OC41MDYzIDQ1LjY3MTMgNzQuNDU5OEM0NS42NzEzIDcyLjk4ODQgNDUuOTc2OCA3MS40NTU2IDQ2LjUyNjcgNjkuOTIyOVpNODMuNjc2MSA0Mi41Nzk0QzgzLjY3NjEgNDYuMTcwNCA4MS41NTc1IDQ3Ljk2NTggNzkuMTg3NSA0Ny45NjU4Qzc2Ljc4MTYgNDcuOTY1OCA3NC42OTg5IDQ2LjE3MDQgNzQuNjk4OSA0Mi41Nzk0Qzc0LjY5ODkgMzguOTg4NSA3Ni43ODE2IDM3LjE5MzEgNzkuMTg3NSAzNy4xOTMxQzgxLjU1NzUgMzcuMTkzMSA4My42NzYxIDM4Ljk4ODUgODMuNjc2MSA0Mi41Nzk0Wk03MC4yMTAzIDQyLjU3OTVDNzAuMjEwMyA0Ni4xNzA0IDY4LjA5MTYgNDcuOTY1OCA2NS43MjE2IDQ3Ljk2NThDNjMuMzE1NyA0Ny45NjU4IDYxLjIzMyA0Ni4xNzA0IDYxLjIzMyA0Mi41Nzk1QzYxLjIzMyAzOC45ODg1IDYzLjMxNTcgMzcuMTkzMSA2NS43MjE2IDM3LjE5MzFDNjguMDkxNiAzNy4xOTMxIDcwLjIxMDMgMzguOTg4NSA3MC4yMTAzIDQyLjU3OTVaIiBmaWxsPSIjRkZGREY4Ii8+Cjwvc3ZnPgo=',\n buildUrl: (url) => `https://phantom.app/ul/browse/${encodeURIComponent(url)}?ref=${encodeURIComponent(url)}`,\n },\n {\n name: 'Solflare',\n icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJTIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MCA1MCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiMwMjA1MGE7c3Ryb2tlOiNmZmVmNDY7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLXdpZHRoOi41cHg7fS5jbHMtMntmaWxsOiNmZmVmNDY7fTwvc3R5bGU+PC9kZWZzPjxyZWN0IGNsYXNzPSJjbHMtMiIgeD0iMCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiByeD0iMTIiIHJ5PSIxMiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTI0LjIzLDI2LjQybDIuNDYtMi4zOCw0LjU5LDEuNWMzLjAxLDEsNC41MSwyLjg0LDQuNTEsNS40MywwLDEuOTYtLjc1LDMuMjYtMi4yNSw0LjkzbC0uNDYuNS4xNy0xLjE3Yy42Ny00LjI2LS41OC02LjA5LTQuNzItNy40M2wtNC4zLTEuMzhoMFpNMTguMDUsMTEuODVsMTIuNTIsNC4xNy0yLjcxLDIuNTktNi41MS0yLjE3Yy0yLjI1LS43NS0zLjAxLTEuOTYtMy4zLTQuNTF2LS4wOGgwWk0xNy4zLDMzLjA2bDIuODQtMi43MSw1LjM0LDEuNzVjMi44LjkyLDMuNzYsMi4xMywzLjQ2LDUuMThsLTExLjY1LTQuMjJoMFpNMTMuNzEsMjAuOTVjMC0uNzkuNDItMS41NCwxLjEzLTIuMTcuNzUsMS4wOSwyLjA1LDIuMDUsNC4wOSwyLjcxbDQuNDIsMS40Ni0yLjQ2LDIuMzgtNC4zNC0xLjQyYy0yLS42Ny0yLjg0LTEuNjctMi44NC0yLjk2TTI2LjgyLDQyLjg3YzkuMTgtNi4wOSwxNC4xMS0xMC4yMywxNC4xMS0xNS4zMiwwLTMuMzgtMi01LjI2LTYuNDMtNi43MmwtMy4zNC0xLjEzLDkuMTQtOC43Ny0xLjg0LTEuOTYtMi43MSwyLjM4LTEyLjgxLTQuMjJjLTMuOTcsMS4yOS04Ljk3LDUuMDktOC45Nyw4Ljg5LDAsLjQyLjA0LjgzLjE3LDEuMjktMy4zLDEuODgtNC42MywzLjYzLTQuNjMsNS44LDAsMi4wNSwxLjA5LDQuMDksNC41NSw1LjIybDIuNzUuOTItOS41Miw5LjE0LDEuODQsMS45NiwyLjk2LTIuNzEsMTQuNzMsNS4yMmgwWiIvPjwvc3ZnPg==',\n buildUrl: (url) => `https://solflare.com/ul/v1/browse/${encodeURIComponent(url)}?ref=${encodeURIComponent(url)}`,\n },\n {\n name: 'Backpack',\n icon: 'data:image/webp;base64,UklGRlgCAABXRUJQVlA4WAoAAAAQAAAAOwAAOwAAQUxQSC8AAAABL6CmbQOGP75e/cti0oiIOI0KBto2+a8ACZjAAQ7wL2gCSCL6PwER2t+KmZpFDwBWUDggAgIAAPALAJ0BKjwAPAA+SSCMRKKiIRYKrTQoBISyAGp7nL12mKuwHiZ/pX71XoA8m7rXfQA8q39lfhJ/cL0ZimIeNSGxOaSWtqEDDdJ++ARG5/LVm6OquItoAu4rpz8VksUr1NEDJ0CeZucwAP7+VdYX7J5e8V3cJZ9QoY9vj8KsNGOvZSm+khDZOvwCeiDFjGweq/8KIUmVQk3T/qW3ONyMcepN2uwyEXpZZiidST0x705r7ZnNuWX42r8oi+FEshvXGWm6DabjfrMbiaxJ15irl2Gj3nKWbZ2v3k/jd172plSBejBs7dNt90Re/m+nmv5kNjM/SPfa4EpzvOdu/8BR+hTnR4qe4eWhTsh/oecEfN31OExdi/6AYrsth4nlx/qGEP70b1/TNKmgaB/18+c9ntTfhku9wYpy17/wN3r+B/1geZPzth+AtNsMDXE99PaPLWdFP9MOIMD6ME+MpZu2H7WSfzY7MkWs/N/NNzAZ0P/9vMvxgcdzFHvs/doeUU9WyVv+Ll8QDJbn9NZl86ZZNYtfP4Ol1hiJHWosWyj/66vhMUeFIcDheXIOSRTzvKwj5ffEl7fn/QwflNU556SEjM8MriwSFJ/nrFBrr8O1/pqdrYGqPijG6tjsBVBHp+EDAbtNLL375I2jnG9i3Xb1ZphsFYNjdRaknYdFf4g5iJBoAAA=',\n buildUrl: (url) => `https://backpack.app/ul/browse/${encodeURIComponent(url)}`,\n },\n];\n\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\nexport function WalletConnectForm() {\n const { walletAdapter, setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n\n // On mobile without wallet adapter, show mobile deep links directly\n if (!walletAdapter && isMobile()) {\n return <MobileWalletFlow />;\n }\n\n if (walletAdapter) {\n return <WalletAdapterFlow />;\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Connect wallet</h3>\n <p className=\"fc-text\">\n No wallet adapter detected. Pass <code>walletAdapter</code> to{' '}\n <code>&lt;ForgeConnectProvider&gt;</code> to enable wallet login.\n </p>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n\n/** Standalone mobile flow — when no wallet adapter is provided but we're on mobile */\nfunction MobileWalletFlow() {\n const { setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const walletConfig = config.walletConfig;\n const preferred = walletConfig?.preferredWallets ?? [];\n const onlyPreferred = walletConfig?.onlyPreferred ?? false;\n\n const walletsToShow = useMemo(() => {\n if (preferred.length > 0) {\n const prefList = preferred\n .map((name) => MOBILE_WALLETS.find((mw) => mw.name === name))\n .filter(Boolean) as MobileWallet[];\n if (onlyPreferred) return prefList;\n const prefNames = new Set(preferred);\n const others = MOBILE_WALLETS.filter((mw) => !prefNames.has(mw.name));\n return [...prefList, ...others];\n }\n return MOBILE_WALLETS;\n }, [preferred, onlyPreferred]);\n\n const handleOpen = (mw: MobileWallet) => {\n const pageUrl = window.location.href;\n window.location.href = mw.buildUrl(pageUrl);\n };\n\n const showMatrica = methods.includes('matrica');\n\n return (\n <div className=\"fc-tab\">\n <div className=\"fc-wallet-list\">\n {showMatrica && <MatricaWalletEntry />}\n {walletsToShow.map((mw) => (\n <button\n key={mw.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleOpen(mw)}\n >\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-preferred\">Open app</span>\n </button>\n ))}\n </div>\n <p className=\"fc-text\" style={{ textAlign: 'center', fontSize: 12, opacity: 0.6 }}>\n You'll be redirected to the wallet app to sign in.\n </p>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n\nfunction WalletAdapterFlow() {\n const { walletAdapter, loginWithWallet, setModalStep, config } = useForgeConnect();\n const wallet = walletAdapter!;\n const walletConfig = config.walletConfig;\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [showOther, setShowOther] = useState(false);\n const [coldWallet, setColdWallet] = useState(false);\n const mobile = useMemo(() => isMobile(), []);\n\n const coldWalletRef = useRef(coldWallet);\n coldWalletRef.current = coldWallet;\n\n // Build a base64→base64 signTransaction wrapper using a specific adapter.\n const buildSignTxFnForAdapter = useCallback((adapter: any): ((txBase64: string) => Promise<string>) | undefined => {\n if (!adapter.signTransaction) return undefined;\n const TxClass = walletConfig?.Transaction;\n if (!TxClass) return undefined;\n return async (txBase64: string) => {\n const bytes = Uint8Array.from(atob(txBase64), (c) => c.charCodeAt(0));\n const tx = TxClass.from(bytes);\n const signedTx = await adapter.signTransaction(tx);\n return btoa(String.fromCharCode(...new Uint8Array(signedTx.serialize())));\n };\n }, [walletConfig?.Transaction]);\n\n // Single handler: connect via React wallet adapter context → then sign\n const handleConnect = async (w: (typeof wallet.wallets)[0]) => {\n if (w.readyState !== 'Installed') {\n if (mobile) {\n const mw = MOBILE_WALLETS.find((m) => m.name === w.adapter.name);\n if (mw) {\n window.location.href = mw.buildUrl(window.location.href);\n return;\n }\n }\n const url = (w.adapter as any).url;\n if (url) window.open(url, '_blank');\n return;\n }\n\n setError('');\n setLoading(true);\n\n try {\n // Step 1: Select in React context (propagates wallet state to the rest of the app)\n wallet.select(w.adapter.name);\n\n // Step 2: Connect via the raw adapter (select is async state — adapter is immediate)\n if (!w.adapter.connected) {\n await (w.adapter as any).connect();\n }\n\n // Step 3: Get publicKey from the adapter (available synchronously after connect)\n const pk = w.adapter.publicKey;\n if (!pk) throw new Error('Wallet did not provide a public key.');\n\n // Step 4: Sign the challenge\n const address: string = pk.toBase58();\n const useCold = coldWalletRef.current;\n const adapterSignMessage = (w.adapter as any).signMessage\n ? (msg: Uint8Array) => (w.adapter as any).signMessage(msg)\n : undefined;\n\n await loginWithWallet(\n address,\n useCold ? undefined : adapterSignMessage,\n 'solana',\n useCold ? buildSignTxFnForAdapter(w.adapter) : undefined,\n );\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not verify your wallet. Please try again.');\n setLoading(false);\n }\n };\n\n const handleMobileOpen = (mw: MobileWallet) => {\n window.location.href = mw.buildUrl(window.location.href);\n };\n\n const preferred = walletConfig?.preferredWallets ?? [];\n const onlyPreferred = walletConfig?.onlyPreferred ?? false;\n const preferredSet = new Set(preferred);\n\n const connectedWalletName = wallet.publicKey\n ? wallet.wallets.find((w) => w.adapter.connected)?.adapter.name ?? null\n : null;\n\n const { preferredWallets, otherWallets } = useMemo(() => {\n const all = wallet.wallets;\n\n const prefList = preferred\n .map((name) => all.find((w) => w.adapter.name === name))\n .filter(Boolean) as typeof all;\n\n if (onlyPreferred && preferred.length > 0) {\n return { preferredWallets: prefList, otherWallets: [] as typeof all };\n }\n\n const others = all.filter(\n (w) => !preferredSet.has(w.adapter.name) && w.readyState === 'Installed',\n );\n\n return { preferredWallets: prefList, otherWallets: others };\n }, [wallet.wallets, walletConfig]);\n\n // On mobile, find wallets from MOBILE_WALLETS that aren't already in the adapter list\n const mobileExtraWallets = useMemo(() => {\n if (!mobile) return [];\n const adapterNames = new Set(wallet.wallets.map((w) => w.adapter.name));\n return MOBILE_WALLETS.filter((mw) => !adapterNames.has(mw.name));\n }, [mobile, wallet.wallets]);\n\n return (\n <div className=\"fc-tab\">\n {loading ? (\n <div style={{ textAlign: 'center', padding: '24px 0' }}>\n <p className=\"fc-tab-title\">Connecting...</p>\n <p className=\"fc-text\">\n {coldWallet\n ? 'Confirm the transaction on your device'\n : 'Approve the connection, then sign the verification request in your wallet'}\n </p>\n {error && (\n <>\n <p className=\"fc-error\">{error}</p>\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={() => { setLoading(false); setError(''); }}\n style={{ marginTop: 8 }}\n >\n Try again\n </button>\n </>\n )}\n </div>\n ) : (\n <>\n <div className=\"fc-wallet-list\">\n {methods.includes('matrica') && <MatricaWalletEntry />}\n {preferredWallets.map((w) => {\n const installed = w.readyState === 'Installed';\n const isConnected = w.adapter.name === connectedWalletName;\n return (\n <button\n key={w.adapter.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleConnect(w)}\n >\n <span className={installed ? 'fc-installed-dot' : ''} style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n {isConnected\n ? <span className=\"fc-badge-preferred\">Last used</span>\n : <span className=\"fc-badge-preferred\">Preferred</span>\n }\n {!installed && mobile && MOBILE_WALLETS.some((mw) => mw.name === w.adapter.name)\n ? <span className=\"fc-badge-install\">Open app</span>\n : !installed && <span className=\"fc-badge-install\">Install</span>\n }\n </button>\n );\n })}\n\n {/* Mobile deep link wallets not already in the adapter list */}\n {mobileExtraWallets.map((mw) => (\n <button\n key={mw.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleMobileOpen(mw)}\n >\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-install\">Open app</span>\n </button>\n ))}\n\n {otherWallets.length > 0 && !showOther && (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => setShowOther(true)}\n >\n <span className=\"fc-other-wallets-icon\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 7h16\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"11\" y=\"10\" width=\"7\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </span>\n <span className=\"fc-wallet-name\">Other wallets</span>\n </button>\n )}\n\n {showOther && otherWallets.map((w) => {\n const isConnected = w.adapter.name === connectedWalletName;\n return (\n <button\n key={w.adapter.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleConnect(w)}\n >\n <span className=\"fc-installed-dot\" style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n {isConnected && <span className=\"fc-badge-preferred\">Last used</span>}\n </button>\n );\n })}\n </div>\n\n {preferredWallets.length === 0 && otherWallets.length === 0 && mobileExtraWallets.length === 0 && (\n <p className=\"fc-text\">No wallet found. Please install a Solana wallet (like Phantom) to continue.</p>\n )}\n\n <label className=\"fc-cold-wallet-toggle\">\n <input\n type=\"checkbox\"\n checked={coldWallet}\n onChange={(e) => setColdWallet(e.target.checked)}\n />\n <span className=\"fc-toggle-track\" />\n <span className=\"fc-cold-wallet-label\">\n <span>Hardware wallet</span>\n <span>Ledger, Trezor, Keystone...</span>\n </span>\n </label>\n\n {error && <p className=\"fc-error\">{error}</p>}\n </>\n )}\n {showBack && !loading && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n","import { useRef, useEffect } from 'react';\n\n/**\n * Safely renders an SVG string by parsing it through the browser's DOMParser\n * and stripping any non-SVG elements (scripts, event handlers, etc.).\n *\n * This replaces dangerouslySetInnerHTML for icon rendering.\n */\nexport function SvgIcon({ svg, className }: { svg: string; className?: string }) {\n const ref = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n if (!ref.current || !svg) return;\n\n try {\n // Parse as HTML so the browser's HTML parser assigns the correct SVG namespace.\n // Using 'image/svg+xml' can leave elements in the null namespace when xmlns is missing.\n const doc = new DOMParser().parseFromString(svg, 'text/html');\n const svgEl = doc.body.querySelector('svg');\n\n if (!svgEl) {\n ref.current.textContent = '';\n return;\n }\n\n // Strip any dangerous elements or attributes\n const dangerous = svgEl.querySelectorAll('script,iframe,object,embed,foreignObject');\n dangerous.forEach((el) => el.remove());\n\n // Remove event handler attributes from all elements\n const all = svgEl.querySelectorAll('*');\n all.forEach((el) => {\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.startsWith('on')) {\n el.removeAttribute(attr.name);\n }\n }\n });\n\n ref.current.textContent = '';\n ref.current.appendChild(svgEl);\n } catch {\n ref.current.textContent = '';\n }\n }, [svg]);\n\n return <span ref={ref} className={className} />;\n}\n","import { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport type { OAuthProvider } from '../../types.js';\nimport { resolveLoginMethods, isOAuthMethod } from '../../resolve-config.js';\nimport { SvgIcon } from '../svg-icon.js';\n\nexport const PROVIDER_INFO: Record<OAuthProvider, { label: string; icon: string }> = {\n google: {\n label: 'Google',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\"/><path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\"/><path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\"/><path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/></svg>',\n },\n discord: {\n label: 'Discord',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128c.126-.094.252-.192.372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03z\" fill=\"#5865F2\"/></svg>',\n },\n twitter: {\n label: 'Twitter',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" fill=\"currentColor\"/></svg>',\n },\n apple: {\n label: 'Apple',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.52-3.23 0-1.44.64-2.2.45-3.06-.4C3.79 16.17 4.36 9.02 8.8 8.78c1.27.06 2.15.72 2.91.76.93-.19 1.82-.88 2.83-.8 1.21.1 2.12.58 2.72 1.49-2.46 1.48-1.88 4.73.52 5.64-.42 1.13-.98 2.24-1.73 3.41zM12.03 8.7c-.12-2.35 1.82-4.38 4.04-4.54.29 2.56-2.34 4.68-4.04 4.54z\" fill=\"currentColor\"/></svg>',\n },\n telegram: {\n label: 'Telegram',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.479.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\" fill=\"#2AABEE\"/></svg>',\n },\n matrica: {\n label: 'Matrica',\n icon: '<svg viewBox=\"2 1 26 26\" width=\"20\" height=\"20\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"11.457\" y=\"10.6387\" width=\"7.00961\" height=\"7.00962\" fill=\"#4A99BF\"/><path d=\"M12.6266 1.87695V5.08969H5.90903V23.1979H12.6266V26.4106H2.69629V1.87695H12.6266Z\" fill=\"#4A99BF\"/><path d=\"M17.2997 26.4106H27.2299V1.87695H17.2997V5.08969H24.0172V23.1979H17.2997V26.4106Z\" fill=\"#4A99BF\"/></svg>',\n },\n};\n\n/** Single OAuth provider button (card-style). */\nexport function OAuthButton({ provider }: { provider: OAuthProvider }) {\n const { loginWithOAuth } = useForgeConnect();\n const info = PROVIDER_INFO[provider];\n\n return (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-oauth\"\n onClick={() => loginWithOAuth(provider)}\n >\n <SvgIcon svg={info.icon} className=\"fc-oauth-icon\" />\n <span className=\"fc-btn-name\">{info.label}</span>\n </button>\n );\n}\n\n/** Renders all OAuth providers from the resolved config. Legacy convenience wrapper. */\nexport function OAuthButtons() {\n const { config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const oauthMethods = methods.filter(isOAuthMethod);\n\n if (oauthMethods.length === 0) return null;\n\n return (\n <div className=\"fc-oauth-buttons\">\n {oauthMethods.map((provider) => (\n <OAuthButton key={provider} provider={provider} />\n ))}\n </div>\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\n\ntype Step = 'email' | 'reset' | 'done';\n\nexport function ForgotPasswordForm() {\n const { forgotPassword, resetPassword, setModalStep } = useForgeConnect();\n const [step, setStep] = useState<Step>('email');\n const [email, setEmail] = useState('');\n const [token, setToken] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const handleSendCode = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await forgotPassword(email);\n setStep('reset');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not send the reset code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleReset = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await resetPassword(token.trim(), password);\n setStep('done');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not reset your password. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n if (step === 'done') {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Password updated</h3>\n <p className=\"fc-text\">Your password has been reset. You can now sign in.</p>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={() => setModalStep('email-login')}>\n Sign in\n </button>\n </div>\n );\n }\n\n if (step === 'reset') {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Set new password</h3>\n <p className=\"fc-text\">We sent a reset code to <strong>{email}</strong>. Paste it below with your new password.</p>\n <form onSubmit={handleReset} className=\"fc-form\">\n <label className=\"fc-label\">\n Reset code\n <input\n type=\"text\"\n className=\"fc-input\"\n value={token}\n onChange={(e) => setToken(e.target.value)}\n placeholder=\"Paste the code from your email\"\n required\n autoComplete=\"off\"\n />\n </label>\n <label className=\"fc-label\">\n New password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"8+ characters\"\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Resetting...' : 'Reset password'}\n </button>\n </form>\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setStep('email')}>\n Resend code\n </button>\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Reset your password</h3>\n <p className=\"fc-text\">Enter your email and we'll send you a reset code.</p>\n <form onSubmit={handleSendCode} className=\"fc-form\">\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Sending...' : 'Send reset code'}\n </button>\n </form>\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('email-login')}>\n Back to sign in\n </button>\n </p>\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\n\nexport function Verify2FAForm() {\n const { verify2FA, verifyRecoveryCode, setModalStep } = useForgeConnect();\n const [code, setCode] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [useRecovery, setUseRecovery] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const submittingRef = useRef(false);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, [useRecovery]);\n\n const submitCode = useCallback(async (codeValue: string, isRecovery: boolean) => {\n if (submittingRef.current || !codeValue.trim()) return;\n submittingRef.current = true;\n setLoading(true);\n setError('');\n try {\n if (isRecovery) {\n await verifyRecoveryCode(codeValue.trim());\n } else {\n await verify2FA(codeValue.trim());\n }\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Verification failed. Please try again.');\n } finally {\n setLoading(false);\n submittingRef.current = false;\n }\n }, [verify2FA, verifyRecoveryCode]);\n\n const handleSubmit = async (e?: React.FormEvent) => {\n e?.preventDefault();\n await submitCode(code, useRecovery);\n };\n\n const handleCodeChange = (value: string) => {\n setCode(value);\n // Auto-submit when 6 digits entered (TOTP mode only)\n if (!useRecovery && value.length === 6 && /^\\d{6}$/.test(value)) {\n submitCode(value, false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n <button type=\"button\" className=\"fc-back\" onClick={() => setModalStep('method-select')}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M10 12L6 8l4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n Back\n </button>\n\n <p className=\"fc-account-section-desc\" style={{ marginTop: 8 }}>\n {useRecovery\n ? 'Enter one of your recovery codes.'\n : 'Enter the 6-digit code from your authenticator app.'\n }\n </p>\n\n {error && <p className=\"fc-error\">{error}</p>}\n\n <form onSubmit={handleSubmit} className=\"fc-form\">\n <input\n ref={inputRef}\n className=\"fc-input fc-input-code\"\n type=\"text\"\n inputMode={useRecovery ? 'text' : 'numeric'}\n autoComplete=\"one-time-code\"\n placeholder={useRecovery ? 'Recovery code' : '000000'}\n maxLength={useRecovery ? 20 : 6}\n value={code}\n onChange={(e) => handleCodeChange(e.target.value)}\n style={useRecovery ? {} : { textAlign: 'center', letterSpacing: '0.3em', fontSize: '1.25rem' }}\n />\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading || !code.trim()}>\n {loading ? 'Verifying...' : 'Verify'}\n </button>\n </form>\n\n <button\n type=\"button\"\n className=\"fc-link\"\n onClick={() => { setUseRecovery(!useRecovery); setCode(''); setError(''); }}\n style={{ marginTop: 12 }}\n >\n {useRecovery ? 'Use authenticator code instead' : 'Use a recovery code'}\n </button>\n </div>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { useUser } from '../hooks/use-user.js';\nimport { useWallets } from '../hooks/use-wallets.js';\nimport { useSessions } from '../hooks/use-sessions.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { TwoFactorModal } from './two-factor-modal.js';\nimport { PasskeysModal } from './passkeys-modal.js';\nimport { PasswordModal } from './password-modal.js';\nimport { DeleteAccountModal } from './delete-account-modal.js';\nimport { PROVIDER_INFO } from './tabs/oauth-buttons.js';\nimport { SvgIcon } from './svg-icon.js';\nimport { timeAgo } from '../lib/utils.js';\nimport type { AccountModalTab, OAuthProvider } from '../types.js';\n\n// ── Friendly provider display ──\n\nconst METHOD_DISPLAY: Record<string, { label: string; iconHtml?: string }> = {\n email: {\n label: 'Email',\n iconHtml: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>',\n },\n solana_wallet: {\n label: 'Solana Wallet',\n iconHtml: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n },\n ethereum_wallet: {\n label: 'Ethereum Wallet',\n iconHtml: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n },\n};\n\nfunction getMethodDisplay(provider: string) {\n // Check OAuth providers first\n if (provider in PROVIDER_INFO) {\n const info = PROVIDER_INFO[provider as OAuthProvider];\n return { label: info.label, iconHtml: info.icon };\n }\n return METHOD_DISPLAY[provider] ?? { label: provider, iconHtml: undefined };\n}\n\nfunction truncate(str: string, max = 12) {\n if (str.length <= max) return str;\n return `${str.slice(0, 6)}...${str.slice(-4)}`;\n}\n\nconst ChevronRight = () => (\n <span className=\"fc-security-card-chevron\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n);\n\n// ── Tab config ──\n\nconst TABS: { key: AccountModalTab; label: string }[] = [\n { key: 'profile', label: 'Profile' },\n { key: 'auth-methods', label: 'Logins' },\n { key: 'wallets', label: 'Wallets' },\n { key: 'sessions', label: 'Security' },\n];\n\n// ── Main ──\n\nexport function AccountModal() {\n const { accountModal, closeAccountModal, openLinkModal, linkModal, config, logout } = useForgeConnect();\n const { user } = useUser();\n const [activeTab, setActiveTab] = useState<AccountModalTab>('profile');\n\n // Track when LinkAuthModal closes → bump key so tabs re-fetch\n const [refreshKey, setRefreshKey] = useState(0);\n const prevLinkOpen = useRef(false);\n useEffect(() => {\n if (prevLinkOpen.current && !linkModal.isOpen) {\n setRefreshKey((k) => k + 1);\n }\n prevLinkOpen.current = linkModal.isOpen;\n }, [linkModal.isOpen]);\n\n if (!accountModal.isOpen) return null;\n\n const theme = config.appearance?.theme ?? 'light';\n const initial = (user?.displayName ?? user?.primaryEmail ?? '?').charAt(0).toUpperCase();\n\n return (\n <ModalOverlay isOpen={accountModal.isOpen} onClose={closeAccountModal}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {/* ── Hero ── */}\n <div className=\"fc-account-hero\">\n {user?.avatarUrl ? (\n <img src={user.avatarUrl} alt=\"\" className=\"fc-account-hero-avatar\" />\n ) : (\n <span className=\"fc-account-hero-avatar fc-account-hero-avatar-placeholder\">{initial}</span>\n )}\n <div className=\"fc-account-hero-info\">\n <span className=\"fc-account-hero-name\">{user?.displayName ?? 'Your account'}</span>\n {user?.primaryEmail && <span className=\"fc-account-hero-email\">{user.primaryEmail}</span>}\n </div>\n </div>\n\n {/* ── Tabs ── */}\n <div className=\"fc-account-tabs\">\n {TABS.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n className={`fc-account-tab${activeTab === tab.key ? ' fc-account-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.key)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* ── Content ── */}\n {activeTab === 'profile' && <ProfileTab />}\n {activeTab === 'auth-methods' && <LoginsTab onLink={() => openLinkModal('auth')} refreshKey={refreshKey} />}\n {activeTab === 'wallets' && <WalletsTab onLink={() => openLinkModal('wallet')} refreshKey={refreshKey} />}\n {activeTab === 'sessions' && <SecurityTab />}\n\n {/* ── Footer ── */}\n <div className=\"fc-account-footer\">\n <button\n type=\"button\"\n className=\"fc-btn-logout\"\n onClick={() => { logout(); closeAccountModal(); }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M7 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3M13 14l4-4-4-4M17 10H7\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n Log out\n </button>\n </div>\n </div>\n </ModalOverlay>\n );\n}\n\n// ── Profile Tab ──\n\nfunction ProfileTab() {\n const { user, updateProfile } = useUser();\n const [displayName, setDisplayName] = useState(user?.displayName ?? '');\n const [avatarUrl, setAvatarUrl] = useState(user?.avatarUrl ?? '');\n const [loading, setLoading] = useState(false);\n const [msg, setMsg] = useState<{ text: string; ok: boolean } | null>(null);\n\n useEffect(() => {\n setDisplayName(user?.displayName ?? '');\n setAvatarUrl(user?.avatarUrl ?? '');\n }, [user]);\n\n const handleSave = async () => {\n setLoading(true);\n setMsg(null);\n try {\n await updateProfile({\n displayName: displayName || undefined,\n avatarUrl: avatarUrl || undefined,\n });\n setMsg({ text: 'Profile updated', ok: true });\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Something went wrong. Please try again.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n <div className=\"fc-form\">\n <label className=\"fc-label\">\n Name\n <input\n className=\"fc-input\"\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n placeholder=\"How should we call you?\"\n />\n </label>\n <label className=\"fc-label\">\n Photo URL\n <input\n className=\"fc-input\"\n value={avatarUrl}\n onChange={(e) => setAvatarUrl(e.target.value)}\n placeholder=\"Paste a link to your photo\"\n />\n </label>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={handleSave} disabled={loading}>\n {loading ? 'Saving...' : 'Save changes'}\n </button>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n </div>\n </div>\n );\n}\n\n// ── Logins Tab ──\n\nfunction LoginsTab({ onLink, refreshKey }: { onLink: () => void; refreshKey: number }) {\n const { authMethods, loading, fetchAuthMethods, unlinkAuthMethod } = useUser();\n const [msg, setMsg] = useState('');\n\n useEffect(() => {\n fetchAuthMethods().catch(() => {});\n }, [fetchAuthMethods, refreshKey]);\n\n const handleRemove = async (id: string) => {\n setMsg('');\n try {\n await unlinkAuthMethod(id);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not remove this sign-in method. Please try again.');\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {msg && <p className=\"fc-error\">{msg}</p>}\n {loading && <p className=\"fc-text\">Loading...</p>}\n <p className=\"fc-account-section-desc\">Ways you can sign in to your account.</p>\n {authMethods?.map((m) => {\n const display = getMethodDisplay(m.provider);\n const detail = m.provider === 'email'\n ? m.providerId\n : m.provider.endsWith('_wallet')\n ? truncate(m.providerId)\n : m.providerId;\n return (\n <div key={m.id} className=\"fc-account-item\">\n {display.iconHtml && (\n <SvgIcon svg={display.iconHtml} className=\"fc-account-item-icon\" />\n )}\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">{display.label}</span>\n <span className=\"fc-account-item-detail\">{detail}</span>\n </div>\n <div className=\"fc-account-item-actions\">\n {m.isVerified && <span className=\"fc-badge-verified\">Verified</span>}\n <button type=\"button\" className=\"fc-btn-danger-sm\" onClick={() => handleRemove(m.id)}>\n Remove\n </button>\n </div>\n </div>\n );\n })}\n {authMethods?.length === 0 && <p className=\"fc-account-empty\">No login methods yet</p>}\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={onLink} style={{ marginTop: 8 }}>\n + Add login method\n </button>\n </div>\n );\n}\n\n// ── Wallets Tab ──\n\nfunction WalletsTab({ onLink, refreshKey }: { onLink: () => void; refreshKey: number }) {\n const { wallets, loading, fetchWallets, updateWallet } = useWallets();\n const [msg, setMsg] = useState('');\n\n useEffect(() => {\n fetchWallets().catch(() => {});\n }, [fetchWallets, refreshKey]);\n\n const handleSetPrimary = async (id: string) => {\n setMsg('');\n try {\n await updateWallet(id, { isPrimary: true });\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not update this wallet. Please try again.');\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {msg && <p className=\"fc-error\">{msg}</p>}\n {loading && <p className=\"fc-text\">Loading...</p>}\n <p className=\"fc-account-section-desc\">Crypto wallets connected to your account.</p>\n {wallets?.map((w) => (\n <div key={w.id} className=\"fc-account-item\">\n <SvgIcon svg={METHOD_DISPLAY[`${w.chain}_wallet`]?.iconHtml ?? ''} className=\"fc-account-item-icon\" />\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">\n {w.chain.charAt(0).toUpperCase() + w.chain.slice(1)}\n {w.isPrimary && <span className=\"fc-badge-primary\" style={{ marginLeft: 6 }}>Primary</span>}\n </span>\n <span className=\"fc-account-item-detail\">{truncate(w.address)}</span>\n </div>\n <div className=\"fc-account-item-actions\">\n {!w.isPrimary && (\n <button type=\"button\" className=\"fc-btn-primary-sm\" onClick={() => handleSetPrimary(w.id)}>\n Make primary\n </button>\n )}\n </div>\n </div>\n ))}\n {wallets?.length === 0 && <p className=\"fc-account-empty\">No wallets connected</p>}\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={onLink} style={{ marginTop: 8 }}>\n + Connect wallet\n </button>\n </div>\n );\n}\n\n// ── Security Tab ──\n\nfunction SecurityTab() {\n const { sessions, loading, fetchSessions, revokeSession } = useSessions();\n const { logoutAll, logout, closeAccountModal, api, getAccessToken } = useForgeConnect();\n const { user, authMethods: userAuthMethods, fetchAuthMethods } = useUser();\n const [msg, setMsg] = useState('');\n\n // Card status\n const [totpEnabled, setTotpEnabled] = useState<boolean | null>(null);\n const [passkeyCount, setPasskeyCount] = useState(0);\n\n // Sub-modal visibility\n const [show2FAModal, setShow2FAModal] = useState(false);\n const [showPasskeyModal, setShowPasskeyModal] = useState(false);\n const [showPasswordModal, setShowPasswordModal] = useState(false);\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n\n const refreshStatus = useCallback(() => {\n const token = getAccessToken();\n if (!token) return;\n api.get2FAStatus(token).then((r) => setTotpEnabled(r.enabled)).catch(() => {});\n }, [api, getAccessToken]);\n\n const refreshPasskeyCount = useCallback(() => {\n const token = getAccessToken();\n if (!token) return;\n api.getPasskeys(token).then((list) => setPasskeyCount(list.length)).catch(() => {});\n }, [api, getAccessToken]);\n\n useEffect(() => {\n fetchSessions().catch(() => {});\n fetchAuthMethods().catch(() => {});\n refreshStatus();\n refreshPasskeyCount();\n }, [fetchSessions, fetchAuthMethods, refreshStatus, refreshPasskeyCount]);\n\n const hasPassword = userAuthMethods?.some((m) => m.provider === 'email');\n\n const handleRevoke = async (id: string) => {\n setMsg('');\n try {\n await revokeSession(id);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not sign out this session. Please try again.');\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {msg && <p className=\"fc-error\">{msg}</p>}\n\n {/* ── 2FA Card ── */}\n <button type=\"button\" className=\"fc-security-card\" onClick={() => setShow2FAModal(true)}>\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 2l6 3v4c0 4.42-2.56 8.22-6 9.5C6.56 17.22 4 13.42 4 9V5l6-3z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M7.5 10.5l2 2 3.5-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Two-factor authentication</span>\n <span className=\"fc-security-card-detail\">\n {totpEnabled === null ? 'Loading...' : totpEnabled ? 'Enabled' : 'Not enabled'}\n </span>\n </span>\n <ChevronRight />\n </button>\n\n {/* ── Passkeys Card ── */}\n <button type=\"button\" className=\"fc-security-card\" onClick={() => setShowPasskeyModal(true)}>\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"8\" cy=\"7\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M13 13.5a5 5 0 0 0-10 0\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M15 10v4m0 0l-1.5-1m1.5 1l1.5-1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Passkeys</span>\n <span className=\"fc-security-card-detail\">\n {passkeyCount === 0 ? 'No passkeys' : `${passkeyCount} passkey${passkeyCount !== 1 ? 's' : ''}`}\n </span>\n </span>\n <ChevronRight />\n </button>\n\n {/* ── Password Card ── */}\n {user?.primaryEmail && (\n <button\n type=\"button\"\n className=\"fc-security-card\"\n onClick={() => setShowPasswordModal(true)}\n >\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"3\" y=\"9\" width=\"14\" height=\"8\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M6 9V6a4 4 0 1 1 8 0v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Password</span>\n <span className=\"fc-security-card-detail\">\n {hasPassword ? 'Change your password' : 'Set a password'}\n </span>\n </span>\n <ChevronRight />\n </button>\n )}\n\n {/* ── Sessions ── */}\n <div className=\"fc-divider\" style={{ margin: '16px 0' }}><span>active sessions</span></div>\n {loading && <p className=\"fc-text\">Loading...</p>}\n {sessions?.map((s) => (\n <div key={s.id} className=\"fc-account-item\">\n <span className=\"fc-account-item-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M7 17h6M10 14v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n </span>\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">\n {s.ipAddress === '127.0.0.1' || s.ipAddress === '::1'\n ? 'This device'\n : truncate(s.ipAddress, 20)}\n </span>\n <span className=\"fc-account-item-detail\">\n Active {timeAgo(s.lastActiveAt)} · Expires {new Date(s.expiresAt).toLocaleDateString()}\n </span>\n </div>\n <div className=\"fc-account-item-actions\">\n <button type=\"button\" className=\"fc-btn-danger-sm\" onClick={() => handleRevoke(s.id)}>\n Sign out\n </button>\n </div>\n </div>\n ))}\n {sessions?.length === 0 && <p className=\"fc-account-empty\">No active sessions</p>}\n {sessions && sessions.length > 1 && (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={() => { logoutAll(); }}\n style={{ marginTop: 8 }}\n >\n Sign out of all devices\n </button>\n )}\n\n {/* ── Danger zone ── */}\n <div className=\"fc-divider\" style={{ margin: '16px 0' }}><span>danger zone</span></div>\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={() => setShowDeleteModal(true)}\n style={{ background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n Delete account\n </button>\n\n {/* ── Sub-modals ── */}\n <TwoFactorModal\n isOpen={show2FAModal}\n onClose={() => { setShow2FAModal(false); refreshStatus(); }}\n initialEnabled={totpEnabled ?? false}\n onStatusChange={(e) => setTotpEnabled(e)}\n />\n <PasskeysModal\n isOpen={showPasskeyModal}\n onClose={() => { setShowPasskeyModal(false); refreshPasskeyCount(); }}\n onCountChange={(count) => setPasskeyCount(count)}\n />\n {user?.primaryEmail && (\n <PasswordModal\n isOpen={showPasswordModal}\n onClose={() => { setShowPasswordModal(false); fetchAuthMethods().catch(() => {}); }}\n hasPassword={hasPassword ?? false}\n />\n )}\n <DeleteAccountModal\n isOpen={showDeleteModal}\n onClose={() => setShowDeleteModal(false)}\n onDeleted={() => { logout(); closeAccountModal(); }}\n />\n </div>\n );\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { AuthMethod } from '../types';\n\nexport function useUser() {\n const { auth, api, config, getAccessToken } = useForgeConnect();\n const [authMethods, setAuthMethods] = useState<AuthMethod[] | null>(null);\n const [loading, setLoading] = useState(false);\n const pendingRefreshRef = useRef(false);\n\n const updateProfile = useCallback(\n async (data: { displayName?: string; avatarUrl?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n return api.updateMe(token, data);\n },\n [api, getAccessToken],\n );\n\n const fetchAuthMethods = useCallback(async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const methods = await api.getAuthMethods(token);\n setAuthMethods(methods as AuthMethod[]);\n return methods;\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken]);\n\n const linkAuthMethod = useCallback(\n async (data: { provider: string; email?: string; password?: string; challengeId?: string; signature?: string; walletAddress?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.linkAuthMethod(token, data);\n await fetchAuthMethods();\n },\n [api, getAccessToken, fetchAuthMethods],\n );\n\n const linkOtpSend = useCallback(\n async (email: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.linkOtpSend(token, email);\n },\n [api, getAccessToken],\n );\n\n const linkOtpVerify = useCallback(\n async (email: string, code: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.linkOtpVerify(token, email, code);\n await fetchAuthMethods();\n },\n [api, getAccessToken, fetchAuthMethods],\n );\n\n const unlinkAuthMethod = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.unlinkAuthMethod(token, id);\n await fetchAuthMethods();\n },\n [api, getAccessToken, fetchAuthMethods],\n );\n\n // ── OAuth linking via popup ──\n\n const linkOAuth = useCallback(\n async (provider: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n\n // Create a short-lived link intent token (avoids exposing JWT in URL)\n const { intentToken } = await api.createLinkIntent(token);\n\n const redirectUri = encodeURIComponent(window.location.origin + '/fc-oauth-callback');\n const url = `${config.apiUrl}/auth/oauth/${provider}/link?intent=${encodeURIComponent(intentToken)}&redirect_uri=${redirectUri}`;\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.innerWidth - width) / 2;\n const top = window.screenY + (window.innerHeight - height) / 2;\n window.open(url, 'fc_oauth_link', `width=${width},height=${height},left=${left},top=${top}`);\n pendingRefreshRef.current = true;\n },\n [api, config.apiUrl, getAccessToken],\n );\n\n // Listen for OAuth link callback\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) return;\n if (event.data?.type === 'fc_oauth_link_success' && pendingRefreshRef.current) {\n pendingRefreshRef.current = false;\n fetchAuthMethods().catch(() => {});\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [fetchAuthMethods]);\n\n return {\n user: auth.user,\n authMethods,\n loading,\n updateProfile,\n fetchAuthMethods,\n linkAuthMethod,\n linkOtpSend,\n linkOtpVerify,\n unlinkAuthMethod,\n linkOAuth,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport { uint8ArrayToBase58 } from '../lib/utils.js';\nimport type { Wallet } from '../types';\n\nexport function useWallets() {\n const { api, getAccessToken } = useForgeConnect();\n const [wallets, setWallets] = useState<Wallet[] | null>(null);\n const [loading, setLoading] = useState(false);\n\n const fetchWallets = useCallback(async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.getWallets(token);\n setWallets(data as Wallet[]);\n return data;\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken]);\n\n const updateWallet = useCallback(\n async (id: string, data: { label?: string; isPrimary?: boolean }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.updateWallet(token, id, data);\n await fetchWallets();\n },\n [api, getAccessToken, fetchWallets],\n );\n\n const linkWallet = useCallback(\n async (\n walletAddress: string,\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined,\n chain: string = 'solana',\n signTransaction?: (txBase64: string) => Promise<string>,\n ) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n\n if (signMessage) {\n // Standard message-signing flow (hot wallets)\n const { challengeId, message: challengeMessage } = await api.walletChallenge(walletAddress, chain);\n const encoded = new TextEncoder().encode(challengeMessage);\n const signatureBytes = await signMessage(encoded);\n const signature = chain === 'solana'\n ? uint8ArrayToBase58(signatureBytes)\n : Array.from(signatureBytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n await api.linkAuthMethod(token, {\n provider: `${chain}_wallet`,\n challengeId,\n signature,\n walletAddress,\n });\n } else {\n // Transaction-based flow (hardware/cold wallets)\n if (!signTransaction) {\n throw new Error('Wallet does not support message signing or transaction signing.');\n }\n const { challengeId, transaction: txBase64 } = await api.walletChallengeTx(walletAddress, chain);\n const signedTxBase64 = await signTransaction(txBase64);\n await api.linkAuthMethod(token, {\n provider: `${chain}_wallet_tx`,\n challengeId,\n signedTransaction: signedTxBase64,\n walletAddress,\n });\n }\n\n await fetchWallets();\n },\n [api, getAccessToken, fetchWallets],\n );\n\n return {\n wallets,\n loading,\n fetchWallets,\n updateWallet,\n linkWallet,\n };\n}\n\n","const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\nexport function uint8ArrayToBase58(bytes: Uint8Array): string {\n const digits = [0];\n for (const byte of bytes) {\n let carry = byte;\n for (let j = 0; j < digits.length; j++) {\n carry += digits[j] << 8;\n digits[j] = carry % 58;\n carry = (carry / 58) | 0;\n }\n while (carry > 0) {\n digits.push(carry % 58);\n carry = (carry / 58) | 0;\n }\n }\n let str = '';\n for (let i = 0; i < bytes.length && bytes[i] === 0; i++) {\n str += '1';\n }\n for (let i = digits.length - 1; i >= 0; i--) {\n str += BASE58_ALPHABET[digits[i]];\n }\n return str;\n}\n\nexport function timeAgo(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diff = now - then;\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n return new Date(dateStr).toLocaleDateString();\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { Session } from '../types';\n\nexport function useSessions() {\n const { api, getAccessToken } = useForgeConnect();\n const [sessions, setSessions] = useState<Session[] | null>(null);\n const [loading, setLoading] = useState(false);\n\n const fetchSessions = useCallback(async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.getSessions(token);\n setSessions(data as Session[]);\n return data;\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken]);\n\n const revokeSession = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.revokeSession(token, id);\n await fetchSessions();\n },\n [api, getAccessToken, fetchSessions],\n );\n\n return {\n sessions,\n loading,\n fetchSessions,\n revokeSession,\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\n\ninterface TwoFactorModalProps {\n isOpen: boolean;\n onClose: () => void;\n initialEnabled: boolean;\n onStatusChange: (enabled: boolean) => void;\n}\n\ntype Step = 'setup' | 'manage' | 'confirm-regenerate' | 'confirm-disable' | 'recovery-codes';\n\nexport function TwoFactorModal({ isOpen, onClose, initialEnabled, onStatusChange }: TwoFactorModalProps) {\n const { api, getAccessToken, config } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [step, setStep] = useState<Step>(initialEnabled ? 'manage' : 'setup');\n\n // Setup state\n const [setupData, setSetupData] = useState<{ secret: string; qrCodeDataUrl: string; recoveryCodes: string[] } | null>(null);\n const [code, setCode] = useState('');\n const [loading, setLoading] = useState(false);\n const [msg, setMsg] = useState<{ text: string; ok: boolean } | null>(null);\n const [showSecret, setShowSecret] = useState(false);\n\n // Recovery codes (shared between setup and regenerate)\n const [recoveryCodes, setRecoveryCodes] = useState<string[]>([]);\n\n useEffect(() => {\n if (isOpen) {\n setStep(initialEnabled ? 'manage' : 'setup');\n setSetupData(null);\n setCode('');\n setMsg(null);\n setLoading(false);\n setShowSecret(false);\n setRecoveryCodes([]);\n\n // Auto-trigger setup if not enabled\n if (!initialEnabled) {\n const token = getAccessToken();\n if (token) {\n setLoading(true);\n api.setup2FA(token)\n .then((data) => {\n setSetupData(data);\n setRecoveryCodes(data.recoveryCodes);\n })\n .catch((err: unknown) => {\n setMsg({ text: err instanceof Error ? err.message : 'Could not set up 2FA.', ok: false });\n })\n .finally(() => setLoading(false));\n }\n }\n }\n }, [isOpen, initialEnabled, api, getAccessToken]);\n\n const handleEnable = async () => {\n const token = getAccessToken();\n if (!token || !code) return;\n setLoading(true);\n setMsg(null);\n try {\n await api.enable2FA(token, code);\n onStatusChange(true);\n setStep('recovery-codes');\n setCode('');\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Invalid code.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n const handleDisable = async () => {\n const token = getAccessToken();\n if (!token || !code) return;\n setLoading(true);\n setMsg(null);\n try {\n await api.disable2FA(token, code);\n onStatusChange(false);\n setCode('');\n onClose();\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Invalid code.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n const handleRegenerate = async () => {\n const token = getAccessToken();\n if (!token || !code) return;\n setLoading(true);\n setMsg(null);\n try {\n const { recoveryCodes: codes } = await api.regenerateRecoveryCodes(token, code);\n setRecoveryCodes(codes);\n setStep('recovery-codes');\n setCode('');\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Invalid code.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n const handleCopyAll = () => {\n navigator.clipboard.writeText(recoveryCodes.join('\\n')).catch(() => {});\n };\n\n const goBack = () => {\n setCode('');\n setMsg(null);\n setStep('manage');\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {/* ── Setup flow (not enabled) ── */}\n {step === 'setup' && (\n <>\n <h2 className=\"fc-modal-title\">Set up 2FA</h2>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n {loading && !setupData && <p className=\"fc-text\">Loading...</p>}\n {setupData && (\n <div className=\"fc-tab\">\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Scan this QR code with your authenticator app\n </p>\n <div style={{ display: 'flex', justifyContent: 'center', margin: '12px 0' }}>\n <img\n src={setupData.qrCodeDataUrl}\n alt=\"TOTP QR code\"\n style={{ width: 180, height: 180, borderRadius: 12 }}\n />\n </div>\n <div style={{ textAlign: 'center', marginBottom: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={() => setShowSecret(!showSecret)}>\n {showSecret ? 'Hide code' : \"Can't scan? Enter manually\"}\n </button>\n {showSecret && (\n <p style={{ margin: '8px 0 0', fontFamily: 'monospace', fontSize: 12, opacity: 0.7, wordBreak: 'break-all' }}>\n {setupData.secret}\n </p>\n )}\n </div>\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-primary\"\n onClick={handleEnable}\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10 }}\n >\n {loading ? 'Verifying...' : 'Verify & Enable'}\n </button>\n </div>\n )}\n </>\n )}\n\n {/* ── Manage (enabled) — just two action buttons ── */}\n {step === 'manage' && (\n <>\n <h2 className=\"fc-modal-title\">Two-factor authentication</h2>\n <div style={{ textAlign: 'center', marginBottom: 20 }}>\n <span className=\"fc-badge-verified\" style={{ fontSize: 12, padding: '4px 12px' }}>Enabled</span>\n </div>\n <div className=\"fc-tab\">\n <button\n type=\"button\"\n className=\"fc-security-card\"\n onClick={() => { setCode(''); setMsg(null); setStep('confirm-regenerate'); }}\n >\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M3 10a7 7 0 0 1 7-7m0 14a7 7 0 0 1-7-7m14 0a7 7 0 0 1-7 7m0-14a7 7 0 0 1 7 7\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M14 3l-1 3h3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Regenerate recovery codes</span>\n <span className=\"fc-security-card-detail\">Get new backup codes</span>\n </span>\n <span className=\"fc-security-card-chevron\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </button>\n\n <button\n type=\"button\"\n className=\"fc-security-card\"\n onClick={() => { setCode(''); setMsg(null); setStep('confirm-disable'); }}\n >\n <span className=\"fc-security-card-icon\" style={{ color: '#dc2626' }}>\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 2l6 3v4c0 4.42-2.56 8.22-6 9.5C6.56 17.22 4 13.42 4 9V5l6-3z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M7.5 7.5l5 5M12.5 7.5l-5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\" style={{ color: '#dc2626' }}>Disable 2FA</span>\n <span className=\"fc-security-card-detail\">Remove two-factor authentication</span>\n </span>\n <span className=\"fc-security-card-chevron\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </button>\n </div>\n </>\n )}\n\n {/* ── Confirm: Regenerate recovery codes ── */}\n {step === 'confirm-regenerate' && (\n <>\n <h2 className=\"fc-modal-title\">Regenerate recovery codes</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Enter your 2FA code to generate new recovery codes. Your old codes will stop working.\n </p>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n <div className=\"fc-tab\">\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-primary\"\n onClick={handleRegenerate}\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10 }}\n >\n {loading ? 'Generating...' : 'Regenerate codes'}\n </button>\n <div className=\"fc-switch\" style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={goBack}>Back</button>\n </div>\n </div>\n </>\n )}\n\n {/* ── Confirm: Disable 2FA ── */}\n {step === 'confirm-disable' && (\n <>\n <h2 className=\"fc-modal-title\">Disable 2FA</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Enter your 2FA code to disable two-factor authentication.\n </p>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n <div className=\"fc-tab\">\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={handleDisable}\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10, background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n {loading ? 'Disabling...' : 'Disable 2FA'}\n </button>\n <div className=\"fc-switch\" style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={goBack}>Back</button>\n </div>\n </div>\n </>\n )}\n\n {/* ── Recovery codes (after enable or regenerate) ── */}\n {step === 'recovery-codes' && (\n <>\n <h2 className=\"fc-modal-title\">Save your recovery codes</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Store these codes somewhere safe. Each code can only be used once.\n </p>\n <div className=\"fc-recovery-grid\">\n {recoveryCodes.map((c, i) => (\n <div key={i} className=\"fc-recovery-code\">{c}</div>\n ))}\n </div>\n <div style={{ textAlign: 'center', margin: '8px 0 12px' }}>\n <button type=\"button\" className=\"fc-link\" onClick={handleCopyAll}>\n Copy all\n </button>\n </div>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={onClose}>\n Done\n </button>\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { startRegistration } from '../runtime-imports.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { timeAgo } from '../lib/utils.js';\nimport type { Passkey } from '../types.js';\n\ninterface PasskeysModalProps {\n isOpen: boolean;\n onClose: () => void;\n onCountChange: (count: number) => void;\n}\n\nexport function PasskeysModal({ isOpen, onClose, onCountChange }: PasskeysModalProps) {\n const { api, getAccessToken, config } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [passkeys, setPasskeys] = useState<Passkey[]>([]);\n const [loading, setLoading] = useState(false);\n const [addLoading, setAddLoading] = useState(false);\n const [msg, setMsg] = useState('');\n\n const fetchPasskeys = useCallback(async () => {\n const token = getAccessToken();\n if (!token) return;\n setLoading(true);\n try {\n const list = await api.getPasskeys(token);\n setPasskeys(list);\n onCountChange(list.length);\n } catch {\n // silently fail\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken, onCountChange]);\n\n useEffect(() => {\n if (isOpen) {\n setMsg('');\n fetchPasskeys();\n }\n }, [isOpen, fetchPasskeys]);\n\n const handleAdd = async () => {\n const token = getAccessToken();\n if (!token) return;\n setAddLoading(true);\n setMsg('');\n try {\n const { options, challengeKey } = await api.getPasskeyRegisterOptions(token, config.webauthnRpId, config.webauthnOrigin);\n const regResponse = await startRegistration({ optionsJSON: options });\n const passkey = await api.verifyPasskeyRegistration(token, challengeKey, regResponse, undefined, config.webauthnRpId, config.webauthnOrigin);\n const updated = [...passkeys, passkey];\n setPasskeys(updated);\n onCountChange(updated.length);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not add passkey.');\n } finally {\n setAddLoading(false);\n }\n };\n\n const handleDelete = async (id: string) => {\n const token = getAccessToken();\n if (!token) return;\n setMsg('');\n try {\n await api.deletePasskey(token, id);\n const updated = passkeys.filter((p) => p.id !== id);\n setPasskeys(updated);\n onCountChange(updated.length);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not remove passkey.');\n }\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n <h2 className=\"fc-modal-title\">Passkeys</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Sign in without a password using biometrics or a security key.\n </p>\n\n {msg && <p className=\"fc-error\">{msg}</p>}\n {loading && <p className=\"fc-text\">Loading...</p>}\n\n <div className=\"fc-tab\">\n {passkeys.map((pk) => (\n <div key={pk.id} className=\"fc-account-item\">\n <span className=\"fc-account-item-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"8\" cy=\"7\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M13 13.5a5 5 0 0 0-10 0\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M15 10v4m0 0l-1.5-1m1.5 1l1.5-1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">{pk.name || 'Passkey'}</span>\n <span className=\"fc-account-item-detail\">\n {pk.deviceType ?? 'Unknown device'}\n {pk.lastUsedAt ? ` · Last used ${timeAgo(pk.lastUsedAt)}` : ''}\n </span>\n </div>\n <div className=\"fc-account-item-actions\">\n {pk.backedUp && <span className=\"fc-badge-verified\">Synced</span>}\n <button type=\"button\" className=\"fc-btn-danger-sm\" onClick={() => handleDelete(pk.id)}>\n Remove\n </button>\n </div>\n </div>\n ))}\n {!loading && passkeys.length === 0 && <p className=\"fc-account-empty\">No passkeys yet</p>}\n\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={handleAdd}\n disabled={addLoading}\n style={{ marginTop: 8 }}\n >\n {addLoading ? 'Adding...' : '+ Add passkey'}\n </button>\n </div>\n </div>\n </ModalOverlay>\n );\n}\n","/**\n * Convert the given array buffer into a Base64URL-encoded string. Ideal for converting various\n * credential response ArrayBuffers to string for sending back to the server as JSON.\n *\n * Helper method to compliment `base64URLStringToBuffer`\n */\nexport function bufferToBase64URLString(buffer) {\n const bytes = new Uint8Array(buffer);\n let str = '';\n for (const charCode of bytes) {\n str += String.fromCharCode(charCode);\n }\n const base64String = btoa(str);\n return base64String.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n","/**\n * Convert from a Base64URL-encoded string to an Array Buffer. Best used when converting a\n * credential ID from a JSON string to an ArrayBuffer, like in allowCredentials or\n * excludeCredentials\n *\n * Helper method to compliment `bufferToBase64URLString`\n */\nexport function base64URLStringToBuffer(base64URLString) {\n // Convert from Base64URL to Base64\n const base64 = base64URLString.replace(/-/g, '+').replace(/_/g, '/');\n /**\n * Pad with '=' until it's a multiple of four\n * (4 - (85 % 4 = 1) = 3) % 4 = 3 padding\n * (4 - (86 % 4 = 2) = 2) % 4 = 2 padding\n * (4 - (87 % 4 = 3) = 1) % 4 = 1 padding\n * (4 - (88 % 4 = 0) = 4) % 4 = 0 padding\n */\n const padLength = (4 - (base64.length % 4)) % 4;\n const padded = base64.padEnd(base64.length + padLength, '=');\n // Convert to a binary string\n const binary = atob(padded);\n // Convert binary string to buffer\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return buffer;\n}\n","/**\n * Determine if the browser is capable of Webauthn\n */\nexport function browserSupportsWebAuthn() {\n return _browserSupportsWebAuthnInternals.stubThis(globalThis?.PublicKeyCredential !== undefined &&\n typeof globalThis.PublicKeyCredential === 'function');\n}\n/**\n * Make it possible to stub the return value during testing\n * @ignore Don't include this in docs output\n */\nexport const _browserSupportsWebAuthnInternals = {\n stubThis: (value) => value,\n};\n","import { base64URLStringToBuffer } from './base64URLStringToBuffer.js';\nexport function toPublicKeyCredentialDescriptor(descriptor) {\n const { id } = descriptor;\n return {\n ...descriptor,\n id: base64URLStringToBuffer(id),\n /**\n * `descriptor.transports` is an array of our `AuthenticatorTransportFuture` that includes newer\n * transports that TypeScript's DOM lib is ignorant of. Convince TS that our list of transports\n * are fine to pass to WebAuthn since browsers will recognize the new value.\n */\n transports: descriptor.transports,\n };\n}\n","/**\n * A simple test to determine if a hostname is a properly-formatted domain name\n *\n * A \"valid domain\" is defined here: https://url.spec.whatwg.org/#valid-domain\n *\n * Regex sourced from here:\n * https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch08s15.html\n */\nexport function isValidDomain(hostname) {\n return (\n // Consider localhost valid as well since it's okay wrt Secure Contexts\n hostname === 'localhost' ||\n /^([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}$/i.test(hostname));\n}\n","/**\n * A custom Error used to return a more nuanced error detailing _why_ one of the eight documented\n * errors in the spec was raised after calling `navigator.credentials.create()` or\n * `navigator.credentials.get()`:\n *\n * - `AbortError`\n * - `ConstraintError`\n * - `InvalidStateError`\n * - `NotAllowedError`\n * - `NotSupportedError`\n * - `SecurityError`\n * - `TypeError`\n * - `UnknownError`\n *\n * Error messages were determined through investigation of the spec to determine under which\n * scenarios a given error would be raised.\n */\nexport class WebAuthnError extends Error {\n constructor({ message, code, cause, name, }) {\n // @ts-ignore: help Rollup understand that `cause` is okay to set\n super(message, { cause });\n Object.defineProperty(this, \"code\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.name = name ?? cause.name;\n this.code = code;\n }\n}\n","import { isValidDomain } from './isValidDomain.js';\nimport { WebAuthnError } from './webAuthnError.js';\n/**\n * Attempt to intuit _why_ an error was raised after calling `navigator.credentials.create()`\n */\nexport function identifyRegistrationError({ error, options, }) {\n const { publicKey } = options;\n if (!publicKey) {\n throw Error('options was missing required publicKey property');\n }\n if (error.name === 'AbortError') {\n if (options.signal instanceof AbortSignal) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 16)\n return new WebAuthnError({\n message: 'Registration ceremony was sent an abort signal',\n code: 'ERROR_CEREMONY_ABORTED',\n cause: error,\n });\n }\n }\n else if (error.name === 'ConstraintError') {\n if (publicKey.authenticatorSelection?.requireResidentKey === true) {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 4)\n return new WebAuthnError({\n message: 'Discoverable credentials were required but no available authenticator supported it',\n code: 'ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT',\n cause: error,\n });\n }\n else if (\n // @ts-ignore: `mediation` doesn't yet exist on CredentialCreationOptions but it's possible as of Sept 2024\n options.mediation === 'conditional' &&\n publicKey.authenticatorSelection?.userVerification === 'required') {\n // https://w3c.github.io/webauthn/#sctn-createCredential (Step 22.4)\n return new WebAuthnError({\n message: 'User verification was required during automatic registration but it could not be performed',\n code: 'ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE',\n cause: error,\n });\n }\n else if (publicKey.authenticatorSelection?.userVerification === 'required') {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 5)\n return new WebAuthnError({\n message: 'User verification was required but no available authenticator supported it',\n code: 'ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT',\n cause: error,\n });\n }\n }\n else if (error.name === 'InvalidStateError') {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 20)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 3)\n return new WebAuthnError({\n message: 'The authenticator was previously registered',\n code: 'ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED',\n cause: error,\n });\n }\n else if (error.name === 'NotAllowedError') {\n /**\n * Pass the error directly through. Platforms are overloading this error beyond what the spec\n * defines and we don't want to overwrite potentially useful error messages.\n */\n return new WebAuthnError({\n message: error.message,\n code: 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY',\n cause: error,\n });\n }\n else if (error.name === 'NotSupportedError') {\n const validPubKeyCredParams = publicKey.pubKeyCredParams.filter((param) => param.type === 'public-key');\n if (validPubKeyCredParams.length === 0) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 10)\n return new WebAuthnError({\n message: 'No entry in pubKeyCredParams was of type \"public-key\"',\n code: 'ERROR_MALFORMED_PUBKEYCREDPARAMS',\n cause: error,\n });\n }\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 2)\n return new WebAuthnError({\n message: 'No available authenticator supported any of the specified pubKeyCredParams algorithms',\n code: 'ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG',\n cause: error,\n });\n }\n else if (error.name === 'SecurityError') {\n const effectiveDomain = globalThis.location.hostname;\n if (!isValidDomain(effectiveDomain)) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 7)\n return new WebAuthnError({\n message: `${globalThis.location.hostname} is an invalid domain`,\n code: 'ERROR_INVALID_DOMAIN',\n cause: error,\n });\n }\n else if (publicKey.rp.id !== effectiveDomain) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 8)\n return new WebAuthnError({\n message: `The RP ID \"${publicKey.rp.id}\" is invalid for this domain`,\n code: 'ERROR_INVALID_RP_ID',\n cause: error,\n });\n }\n }\n else if (error.name === 'TypeError') {\n if (publicKey.user.id.byteLength < 1 || publicKey.user.id.byteLength > 64) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 5)\n return new WebAuthnError({\n message: 'User ID was not between 1 and 64 characters',\n code: 'ERROR_INVALID_USER_ID_LENGTH',\n cause: error,\n });\n }\n }\n else if (error.name === 'UnknownError') {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 1)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 8)\n return new WebAuthnError({\n message: 'The authenticator was unable to process the specified options, or could not create a new credential',\n code: 'ERROR_AUTHENTICATOR_GENERAL_ERROR',\n cause: error,\n });\n }\n return error;\n}\n","class BaseWebAuthnAbortService {\n constructor() {\n Object.defineProperty(this, \"controller\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n }\n createNewAbortSignal() {\n // Abort any existing calls to navigator.credentials.create() or navigator.credentials.get()\n if (this.controller) {\n const abortError = new Error('Cancelling existing WebAuthn API call for new one');\n abortError.name = 'AbortError';\n this.controller.abort(abortError);\n }\n const newController = new AbortController();\n this.controller = newController;\n return newController.signal;\n }\n cancelCeremony() {\n if (this.controller) {\n const abortError = new Error('Manually cancelling existing WebAuthn API call');\n abortError.name = 'AbortError';\n this.controller.abort(abortError);\n this.controller = undefined;\n }\n }\n}\n/**\n * A service singleton to help ensure that only a single WebAuthn ceremony is active at a time.\n *\n * Users of **@simplewebauthn/browser** shouldn't typically need to use this, but it can help e.g.\n * developers building projects that use client-side routing to better control the behavior of\n * their UX in response to router navigation events.\n */\nexport const WebAuthnAbortService = new BaseWebAuthnAbortService();\n","const attachments = ['cross-platform', 'platform'];\n/**\n * If possible coerce a `string` value into a known `AuthenticatorAttachment`\n */\nexport function toAuthenticatorAttachment(attachment) {\n if (!attachment) {\n return;\n }\n if (attachments.indexOf(attachment) < 0) {\n return;\n }\n return attachment;\n}\n","import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString.js';\nimport { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.js';\nimport { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.js';\nimport { toPublicKeyCredentialDescriptor } from '../helpers/toPublicKeyCredentialDescriptor.js';\nimport { identifyRegistrationError } from '../helpers/identifyRegistrationError.js';\nimport { WebAuthnAbortService } from '../helpers/webAuthnAbortService.js';\nimport { toAuthenticatorAttachment } from '../helpers/toAuthenticatorAttachment.js';\n/**\n * Begin authenticator \"registration\" via WebAuthn attestation\n *\n * @param optionsJSON Output from **@simplewebauthn/server**'s `generateRegistrationOptions()`\n * @param useAutoRegister (Optional) Try to silently create a passkey with the password manager that the user just signed in with. Defaults to `false`.\n */\nexport async function startRegistration(options) {\n // @ts-ignore: Intentionally check for old call structure to warn about improper API call\n if (!options.optionsJSON && options.challenge) {\n console.warn('startRegistration() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information.');\n // @ts-ignore: Reassign the options, passed in as a positional argument, to the expected variable\n options = { optionsJSON: options };\n }\n const { optionsJSON, useAutoRegister = false } = options;\n if (!browserSupportsWebAuthn()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n // We need to convert some values to Uint8Arrays before passing the credentials to the navigator\n const publicKey = {\n ...optionsJSON,\n challenge: base64URLStringToBuffer(optionsJSON.challenge),\n user: {\n ...optionsJSON.user,\n id: base64URLStringToBuffer(optionsJSON.user.id),\n },\n excludeCredentials: optionsJSON.excludeCredentials?.map(toPublicKeyCredentialDescriptor),\n };\n // Prepare options for `.create()`\n const createOptions = {};\n /**\n * Try to use conditional create to register a passkey for the user with the password manager\n * the user just used to authenticate with. The user won't be shown any prominent UI by the\n * browser.\n */\n if (useAutoRegister) {\n // @ts-ignore: `mediation` doesn't yet exist on CredentialCreationOptions but it's possible as of Sept 2024\n createOptions.mediation = 'conditional';\n }\n // Finalize options\n createOptions.publicKey = publicKey;\n // Set up the ability to cancel this request if the user attempts another\n createOptions.signal = WebAuthnAbortService.createNewAbortSignal();\n // Wait for the user to complete attestation\n let credential;\n try {\n credential = (await navigator.credentials.create(createOptions));\n }\n catch (err) {\n throw identifyRegistrationError({ error: err, options: createOptions });\n }\n if (!credential) {\n throw new Error('Registration was not completed');\n }\n const { id, rawId, response, type } = credential;\n // Continue to play it safe with `getTransports()` for now, even when L3 types say it's required\n let transports = undefined;\n if (typeof response.getTransports === 'function') {\n transports = response.getTransports();\n }\n // L3 says this is required, but browser and webview support are still not guaranteed.\n let responsePublicKeyAlgorithm = undefined;\n if (typeof response.getPublicKeyAlgorithm === 'function') {\n try {\n responsePublicKeyAlgorithm = response.getPublicKeyAlgorithm();\n }\n catch (error) {\n warnOnBrokenImplementation('getPublicKeyAlgorithm()', error);\n }\n }\n let responsePublicKey = undefined;\n if (typeof response.getPublicKey === 'function') {\n try {\n const _publicKey = response.getPublicKey();\n if (_publicKey !== null) {\n responsePublicKey = bufferToBase64URLString(_publicKey);\n }\n }\n catch (error) {\n warnOnBrokenImplementation('getPublicKey()', error);\n }\n }\n // L3 says this is required, but browser and webview support are still not guaranteed.\n let responseAuthenticatorData;\n if (typeof response.getAuthenticatorData === 'function') {\n try {\n responseAuthenticatorData = bufferToBase64URLString(response.getAuthenticatorData());\n }\n catch (error) {\n warnOnBrokenImplementation('getAuthenticatorData()', error);\n }\n }\n return {\n id,\n rawId: bufferToBase64URLString(rawId),\n response: {\n attestationObject: bufferToBase64URLString(response.attestationObject),\n clientDataJSON: bufferToBase64URLString(response.clientDataJSON),\n transports,\n publicKeyAlgorithm: responsePublicKeyAlgorithm,\n publicKey: responsePublicKey,\n authenticatorData: responseAuthenticatorData,\n },\n type,\n clientExtensionResults: credential.getClientExtensionResults(),\n authenticatorAttachment: toAuthenticatorAttachment(credential.authenticatorAttachment),\n };\n}\n/**\n * Visibly warn when we detect an issue related to a passkey provider intercepting WebAuthn API\n * calls\n */\nfunction warnOnBrokenImplementation(methodName, cause) {\n console.warn(`The browser extension that intercepted this WebAuthn API call incorrectly implemented ${methodName}. You should report this error to them.\\n`, cause);\n}\n","import { browserSupportsWebAuthn } from './browserSupportsWebAuthn.js';\n/**\n * Determine if the browser supports conditional UI, so that WebAuthn credentials can\n * be shown to the user in the browser's typical password autofill popup.\n */\nexport function browserSupportsWebAuthnAutofill() {\n if (!browserSupportsWebAuthn()) {\n return _browserSupportsWebAuthnAutofillInternals.stubThis(new Promise((resolve) => resolve(false)));\n }\n /**\n * I don't like the `as unknown` here but there's a `declare var PublicKeyCredential` in\n * TS' DOM lib that's making it difficult for me to just go `as PublicKeyCredentialFuture` as I\n * want. I think I'm fine with this for now since it's _supposed_ to be temporary, until TS types\n * have a chance to catch up.\n */\n const globalPublicKeyCredential = globalThis\n .PublicKeyCredential;\n if (globalPublicKeyCredential?.isConditionalMediationAvailable === undefined) {\n return _browserSupportsWebAuthnAutofillInternals.stubThis(new Promise((resolve) => resolve(false)));\n }\n return _browserSupportsWebAuthnAutofillInternals.stubThis(globalPublicKeyCredential.isConditionalMediationAvailable());\n}\n// Make it possible to stub the return value during testing\nexport const _browserSupportsWebAuthnAutofillInternals = {\n stubThis: (value) => value,\n};\n","import { isValidDomain } from './isValidDomain.js';\nimport { WebAuthnError } from './webAuthnError.js';\n/**\n * Attempt to intuit _why_ an error was raised after calling `navigator.credentials.get()`\n */\nexport function identifyAuthenticationError({ error, options, }) {\n const { publicKey } = options;\n if (!publicKey) {\n throw Error('options was missing required publicKey property');\n }\n if (error.name === 'AbortError') {\n if (options.signal instanceof AbortSignal) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 16)\n return new WebAuthnError({\n message: 'Authentication ceremony was sent an abort signal',\n code: 'ERROR_CEREMONY_ABORTED',\n cause: error,\n });\n }\n }\n else if (error.name === 'NotAllowedError') {\n /**\n * Pass the error directly through. Platforms are overloading this error beyond what the spec\n * defines and we don't want to overwrite potentially useful error messages.\n */\n return new WebAuthnError({\n message: error.message,\n code: 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY',\n cause: error,\n });\n }\n else if (error.name === 'SecurityError') {\n const effectiveDomain = globalThis.location.hostname;\n if (!isValidDomain(effectiveDomain)) {\n // https://www.w3.org/TR/webauthn-2/#sctn-discover-from-external-source (Step 5)\n return new WebAuthnError({\n message: `${globalThis.location.hostname} is an invalid domain`,\n code: 'ERROR_INVALID_DOMAIN',\n cause: error,\n });\n }\n else if (publicKey.rpId !== effectiveDomain) {\n // https://www.w3.org/TR/webauthn-2/#sctn-discover-from-external-source (Step 6)\n return new WebAuthnError({\n message: `The RP ID \"${publicKey.rpId}\" is invalid for this domain`,\n code: 'ERROR_INVALID_RP_ID',\n cause: error,\n });\n }\n }\n else if (error.name === 'UnknownError') {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-get-assertion (Step 1)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-get-assertion (Step 12)\n return new WebAuthnError({\n message: 'The authenticator was unable to process the specified options, or could not create a new assertion signature',\n code: 'ERROR_AUTHENTICATOR_GENERAL_ERROR',\n cause: error,\n });\n }\n return error;\n}\n","import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString.js';\nimport { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.js';\nimport { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.js';\nimport { browserSupportsWebAuthnAutofill } from '../helpers/browserSupportsWebAuthnAutofill.js';\nimport { toPublicKeyCredentialDescriptor } from '../helpers/toPublicKeyCredentialDescriptor.js';\nimport { identifyAuthenticationError } from '../helpers/identifyAuthenticationError.js';\nimport { WebAuthnAbortService } from '../helpers/webAuthnAbortService.js';\nimport { toAuthenticatorAttachment } from '../helpers/toAuthenticatorAttachment.js';\n/**\n * Begin authenticator \"login\" via WebAuthn assertion\n *\n * @param optionsJSON Output from **@simplewebauthn/server**'s `generateAuthenticationOptions()`\n * @param useBrowserAutofill (Optional) Initialize conditional UI to enable logging in via browser autofill prompts. Defaults to `false`.\n * @param verifyBrowserAutofillInput (Optional) Ensure a suitable `<input>` element is present when `useBrowserAutofill` is `true`. Defaults to `true`.\n */\nexport async function startAuthentication(options) {\n // @ts-ignore: Intentionally check for old call structure to warn about improper API call\n if (!options.optionsJSON && options.challenge) {\n console.warn('startAuthentication() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information.');\n // @ts-ignore: Reassign the options, passed in as a positional argument, to the expected variable\n options = { optionsJSON: options };\n }\n const { optionsJSON, useBrowserAutofill = false, verifyBrowserAutofillInput = true, } = options;\n if (!browserSupportsWebAuthn()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n // We need to avoid passing empty array to avoid blocking retrieval\n // of public key\n let allowCredentials;\n if (optionsJSON.allowCredentials?.length !== 0) {\n allowCredentials = optionsJSON.allowCredentials?.map(toPublicKeyCredentialDescriptor);\n }\n // We need to convert some values to Uint8Arrays before passing the credentials to the navigator\n const publicKey = {\n ...optionsJSON,\n challenge: base64URLStringToBuffer(optionsJSON.challenge),\n allowCredentials,\n };\n // Prepare options for `.get()`\n const getOptions = {};\n /**\n * Set up the page to prompt the user to select a credential for authentication via the browser's\n * input autofill mechanism.\n */\n if (useBrowserAutofill) {\n if (!(await browserSupportsWebAuthnAutofill())) {\n throw Error('Browser does not support WebAuthn autofill');\n }\n // Check for an <input> with \"webauthn\" in its `autocomplete` attribute\n const eligibleInputs = document.querySelectorAll(\"input[autocomplete$='webauthn']\");\n // WebAuthn autofill requires at least one valid input\n if (eligibleInputs.length < 1 && verifyBrowserAutofillInput) {\n throw Error('No <input> with \"webauthn\" as the only or last value in its `autocomplete` attribute was detected');\n }\n // `CredentialMediationRequirement` doesn't know about \"conditional\" yet as of\n // typescript@4.6.3\n getOptions.mediation = 'conditional';\n // Conditional UI requires an empty allow list\n publicKey.allowCredentials = [];\n }\n // Finalize options\n getOptions.publicKey = publicKey;\n // Set up the ability to cancel this request if the user attempts another\n getOptions.signal = WebAuthnAbortService.createNewAbortSignal();\n // Wait for the user to complete assertion\n let credential;\n try {\n credential = (await navigator.credentials.get(getOptions));\n }\n catch (err) {\n throw identifyAuthenticationError({ error: err, options: getOptions });\n }\n if (!credential) {\n throw new Error('Authentication was not completed');\n }\n const { id, rawId, response, type } = credential;\n let userHandle = undefined;\n if (response.userHandle) {\n userHandle = bufferToBase64URLString(response.userHandle);\n }\n // Convert values to base64 to make it easier to send back to the server\n return {\n id,\n rawId: bufferToBase64URLString(rawId),\n response: {\n authenticatorData: bufferToBase64URLString(response.authenticatorData),\n clientDataJSON: bufferToBase64URLString(response.clientDataJSON),\n signature: bufferToBase64URLString(response.signature),\n userHandle,\n },\n type,\n clientExtensionResults: credential.getClientExtensionResults(),\n authenticatorAttachment: toAuthenticatorAttachment(credential.authenticatorAttachment),\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { ErrorView } from './error-view.js';\n\ninterface PasswordModalProps {\n isOpen: boolean;\n onClose: () => void;\n hasPassword: boolean;\n}\n\ntype Step = 'form' | 'done' | 'error';\n\nexport function PasswordModal({ isOpen, onClose, hasPassword }: PasswordModalProps) {\n const { api, getAccessToken, config } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [step, setStep] = useState<Step>('form');\n const [currentPassword, setCurrentPassword] = useState('');\n const [newPassword, setNewPassword] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n useEffect(() => {\n if (isOpen) {\n setStep('form');\n setCurrentPassword('');\n setNewPassword('');\n setError('');\n setLoading(false);\n }\n }, [isOpen]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.setPassword(token, newPassword, hasPassword ? currentPassword : undefined);\n setStep('done');\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Could not set your password. Please try again.';\n setError(msg);\n setStep('error');\n } finally {\n setLoading(false);\n }\n };\n\n const title = hasPassword ? 'Change password' : 'Set a password';\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {step === 'done' ? (\n <div className=\"fc-tab\" style={{ textAlign: 'center', padding: '24px 0' }}>\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Password {hasPassword ? 'updated' : 'set'}</p>\n </div>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={onClose} style={{ marginTop: 16 }}>\n Done\n </button>\n </div>\n ) : step === 'error' ? (\n <ErrorView\n title=\"Password update failed\"\n message={error}\n onRetry={() => setStep('form')}\n onClose={onClose}\n />\n ) : (\n <>\n <h2 className=\"fc-modal-title\">{title}</h2>\n <div className=\"fc-tab\">\n <form onSubmit={handleSubmit} className=\"fc-form\">\n {hasPassword && (\n <label className=\"fc-label\">\n Current password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={currentPassword}\n onChange={(e) => setCurrentPassword(e.target.value)}\n placeholder=\"Enter current password\"\n required\n autoComplete=\"current-password\"\n />\n </label>\n )}\n <label className=\"fc-label\">\n New password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n placeholder=\"8+ characters\"\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Saving...' : hasPassword ? 'Update password' : 'Set password'}\n </button>\n </form>\n </div>\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n","export interface ErrorViewProps {\n title?: string;\n message?: string;\n onRetry?: () => void;\n onClose?: () => void;\n}\n\nexport function ErrorView({\n title = 'Something went wrong',\n message,\n onRetry,\n onClose,\n}: ErrorViewProps) {\n return (\n <div className=\"fc-error-view\">\n <div className=\"fc-error-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-error-check\">\n <circle className=\"fc-error-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <line className=\"fc-error-cross-1\" x1=\"16\" y1=\"16\" x2=\"36\" y2=\"36\" />\n <line className=\"fc-error-cross-2\" x1=\"36\" y1=\"16\" x2=\"16\" y2=\"36\" />\n </svg>\n </div>\n <p className=\"fc-error-text\">{title}</p>\n {message && <p className=\"fc-error-subtext\">{message}</p>}\n {(onRetry || onClose) && (\n <div className=\"fc-error-actions\">\n {onRetry && (\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={onRetry}>\n Try again\n </button>\n )}\n {onClose && (\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={onClose}>\n Close\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { ErrorView } from './error-view.js';\n\ninterface DeleteAccountModalProps {\n isOpen: boolean;\n onClose: () => void;\n onDeleted: () => void;\n}\n\ntype Step = 'confirm' | 'code' | 'done' | 'error';\n\nexport function DeleteAccountModal({ isOpen, onClose, onDeleted }: DeleteAccountModalProps) {\n const { api, getAccessToken, config, logout } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [step, setStep] = useState<Step>('confirm');\n const [code, setCode] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n useEffect(() => {\n if (isOpen) {\n setStep('confirm');\n setCode('');\n setError('');\n setLoading(false);\n }\n }, [isOpen]);\n\n const handleDelete = async () => {\n setError('');\n setLoading(true);\n try {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const { requiresVerification } = await api.requestAccountDeletion(token);\n if (requiresVerification) {\n setStep('code');\n } else {\n await api.confirmAccountDeletion(token);\n setStep('done');\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Something went wrong. Please try again.';\n setError(msg);\n setStep('error');\n } finally {\n setLoading(false);\n }\n };\n\n const handleConfirmCode = async (e: React.FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.confirmAccountDeletion(token, code);\n setStep('done');\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Something went wrong. Please try again.';\n setError(msg);\n setStep('error');\n } finally {\n setLoading(false);\n }\n };\n\n const handleDone = () => {\n logout();\n onDeleted();\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={step === 'done' ? handleDone : onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {step === 'confirm' && (\n <>\n <h2 className=\"fc-modal-title\">Delete account</h2>\n <div className=\"fc-tab\" style={{ textAlign: 'center' }}>\n <p className=\"fc-account-section-desc\">\n This will permanently delete your account and all associated data. This action cannot be undone.\n </p>\n {error && <p className=\"fc-error\">{error}</p>}\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={handleDelete}\n disabled={loading}\n style={{ marginTop: 12, background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n {loading ? 'Processing...' : 'Delete my account'}\n </button>\n <div style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={onClose}>Cancel</button>\n </div>\n </div>\n </>\n )}\n\n {step === 'code' && (\n <>\n <h2 className=\"fc-modal-title\">Verify your identity</h2>\n <div className=\"fc-tab\">\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Enter the 6-digit code sent to your email to confirm deletion.\n </p>\n {error && <p className=\"fc-error\">{error}</p>}\n <form onSubmit={handleConfirmCode} className=\"fc-form\">\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"submit\"\n className=\"fc-btn fc-btn-secondary\"\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10, background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n {loading ? 'Deleting...' : 'Delete my account'}\n </button>\n </form>\n <div style={{ marginTop: 12, textAlign: 'center' }}>\n <button type=\"button\" className=\"fc-link\" onClick={onClose}>Cancel</button>\n </div>\n </div>\n </>\n )}\n\n {step === 'done' && (\n <div className=\"fc-tab\" style={{ textAlign: 'center', padding: '24px 0' }}>\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Account deleted</p>\n </div>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={handleDone} style={{ marginTop: 16 }}>\n Done\n </button>\n </div>\n )}\n\n {step === 'error' && (\n <ErrorView\n title=\"Deletion failed\"\n message={error}\n onRetry={() => setStep('confirm')}\n onClose={onClose}\n />\n )}\n </div>\n </ModalOverlay>\n );\n}\n","import { useState, useEffect, useMemo, useRef, useCallback } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { useUser } from '../hooks/use-user.js';\nimport { useWallets } from '../hooks/use-wallets.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { ErrorView } from './error-view.js';\nimport { PROVIDER_INFO } from './tabs/oauth-buttons.js';\nimport { SvgIcon } from './svg-icon.js';\nimport { MOBILE_WALLETS, isMobile } from './tabs/wallet-connect.js';\nimport { resolveLoginMethods, isOAuthMethod } from '../resolve-config.js';\nimport type { OAuthProvider } from '../types.js';\n\ntype LinkStep = 'method-select' | 'email' | 'otp' | 'wallet' | 'success' | 'error';\n\nexport function LinkAuthModal() {\n const { linkModal, closeLinkModal, config } = useForgeConnect();\n const { linkOAuth, authMethods } = useUser();\n const mode = linkModal.mode ?? 'auth';\n const [step, setStep] = useState<LinkStep>('method-select');\n const [fatalError, setFatalError] = useState('');\n\n // When modal opens, set the correct initial step\n useEffect(() => {\n if (linkModal.isOpen) {\n setStep(mode === 'wallet' ? 'wallet' : 'method-select');\n setFatalError('');\n }\n }, [linkModal.isOpen, mode]);\n\n // Listen for OAuth link success (popup sends postMessage)\n useEffect(() => {\n if (!linkModal.isOpen) return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) return;\n if (event.data?.type === 'fc_oauth_link_success') {\n setStep('success');\n setTimeout(() => {\n handleClose();\n }, 1500);\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [linkModal.isOpen]);\n\n if (!linkModal.isOpen) return null;\n\n const theme = config.appearance?.theme ?? 'light';\n\n const handleClose = () => {\n setStep('method-select');\n closeLinkModal();\n };\n\n const handleSuccess = () => {\n setStep('success');\n setTimeout(() => {\n handleClose();\n }, 1500);\n };\n\n const handleOAuthDirect = (provider: string) => {\n linkOAuth(provider);\n };\n\n const handleFatalError = (msg: string) => {\n setFatalError(msg);\n setStep('error');\n };\n\n const title = step === 'success' || step === 'error'\n ? ''\n : step === 'email'\n ? 'Link email'\n : step === 'otp'\n ? 'Link email'\n : mode === 'wallet' || step === 'wallet'\n ? 'Connect wallet'\n : 'Link a method';\n\n return (\n <ModalOverlay isOpen={linkModal.isOpen} onClose={handleClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {step === 'success' ? (\n <SuccessView />\n ) : step === 'error' ? (\n <ErrorView\n title=\"Linking failed\"\n message={fatalError}\n onRetry={() => setStep(mode === 'wallet' ? 'wallet' : 'method-select')}\n onClose={handleClose}\n />\n ) : (\n <>\n <h2 className=\"fc-modal-title\">{title}</h2>\n {step === 'method-select' && (\n <AuthMethodSelectStep\n config={config}\n connectedProviders={authMethods?.map(m => m.provider) ?? []}\n onSelectEmail={() => setStep('email')}\n onSelectOtp={() => setStep('otp')}\n onOAuth={handleOAuthDirect}\n />\n )}\n {step === 'email' && (\n <EmailLinkStep\n onBack={mode === 'wallet' ? undefined : () => setStep('method-select')}\n onSuccess={handleSuccess}\n onFatalError={handleFatalError}\n />\n )}\n {step === 'otp' && (\n <OtpLinkStep\n onBack={() => setStep('method-select')}\n onSuccess={handleSuccess}\n onFatalError={handleFatalError}\n />\n )}\n {step === 'wallet' && (\n <WalletLinkStep\n onBack={mode === 'wallet' ? undefined : () => setStep('method-select')}\n onSuccess={handleSuccess}\n onFatalError={handleFatalError}\n />\n )}\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n\n// ── Icons ──\n\nconst EmailIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\nconst MagicCodeIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"3\" y=\"5\" width=\"14\" height=\"10\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M7 10h1.5M9.5 10h1M11.5 10h1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\n// ── Auth Method Select (socials + email + otp, filtered) ──\n\nfunction AuthMethodSelectStep({\n config,\n connectedProviders,\n onSelectEmail,\n onSelectOtp,\n onOAuth,\n}: {\n config: import('../types.js').ForgeConnectConfig;\n connectedProviders: string[];\n onSelectEmail: () => void;\n onSelectOtp: () => void;\n onOAuth: (provider: string) => void;\n}) {\n const methods = resolveLoginMethods(config);\n const connectedSet = new Set(connectedProviders);\n const hasEmail = connectedSet.has('email');\n\n // Filter: only auth methods from config (no wallet/passkey), exclude already-connected\n const availableMethods = methods.filter((m) => {\n if (m === 'wallet' || m === 'passkey') return false;\n // Both email and otp link an email — skip if email already connected\n if (m === 'email') return !hasEmail;\n if (m === 'otp') return !hasEmail;\n if (isOAuthMethod(m)) return !connectedSet.has(m);\n return false;\n });\n\n if (availableMethods.length === 0) {\n return (\n <div className=\"fc-tab\">\n <p className=\"fc-text\">All available login methods are already connected.</p>\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n {availableMethods.map((method) => {\n if (method === 'email') {\n return (\n <button key=\"email\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={onSelectEmail}>\n <EmailIcon /> <span className=\"fc-btn-name\">Email &amp; password</span>\n </button>\n );\n }\n\n if (method === 'otp') {\n return (\n <button key=\"otp\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={onSelectOtp}>\n <MagicCodeIcon /> <span className=\"fc-btn-name\">Magic code</span>\n </button>\n );\n }\n\n // OAuth provider\n const provider = method as OAuthProvider;\n const info = PROVIDER_INFO[provider];\n if (!info) return null;\n\n return (\n <button\n key={provider}\n type=\"button\"\n className=\"fc-btn fc-btn-method\"\n onClick={() => onOAuth(provider)}\n >\n <SvgIcon svg={info.icon} className=\"fc-oauth-icon\" />\n <span className=\"fc-btn-name\">{info.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\n// ── Email Link Step ──\n\nfunction EmailLinkStep({ onBack, onSuccess, onFatalError }: { onBack?: () => void; onSuccess: () => void; onFatalError: (msg: string) => void }) {\n const { linkAuthMethod } = useUser();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError('');\n try {\n await linkAuthMethod({ provider: 'email', email, password });\n onSuccess();\n } catch (err: unknown) {\n onFatalError(err instanceof Error ? err.message : 'Could not link this email. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {error && <p className=\"fc-error\">{error}</p>}\n <form className=\"fc-form\" onSubmit={handleSubmit}>\n <label className=\"fc-label\">\n Email\n <input className=\"fc-input\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} required placeholder=\"you@example.com\" />\n </label>\n <label className=\"fc-label\">\n Password\n <input className=\"fc-input\" type=\"password\" value={password} onChange={(e) => setPassword(e.target.value)} required minLength={8} placeholder=\"8+ characters\" />\n </label>\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Linking...' : 'Link email'}\n </button>\n </form>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n}\n\n// ── OTP Link Step (magic code) ──\n\nfunction OtpLinkStep({ onBack, onSuccess, onFatalError }: { onBack?: () => void; onSuccess: () => void; onFatalError: (msg: string) => void }) {\n const { linkOtpSend, linkOtpVerify } = useUser();\n const [email, setEmail] = useState('');\n const [code, setCode] = useState('');\n const [codeSent, setCodeSent] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n const handleSendCode = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError('');\n try {\n await linkOtpSend(email);\n setCodeSent(true);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not send code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerifyCode = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError('');\n try {\n await linkOtpVerify(email, code);\n onSuccess();\n } catch (err: unknown) {\n onFatalError(err instanceof Error ? err.message : 'Invalid code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n if (!codeSent) {\n return (\n <div className=\"fc-tab\">\n {error && <p className=\"fc-error\">{error}</p>}\n <form className=\"fc-form\" onSubmit={handleSendCode}>\n <label className=\"fc-label\">\n Email\n <input className=\"fc-input\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} required placeholder=\"you@example.com\" />\n </label>\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Sending...' : 'Send code'}\n </button>\n </form>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <p className=\"fc-text\">A 6-digit code was sent to <strong>{email}</strong></p>\n {error && <p className=\"fc-error\">{error}</p>}\n <form className=\"fc-form\" onSubmit={handleVerifyCode}>\n <label className=\"fc-label\">\n Code\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]{6}\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, '').slice(0, 6))}\n required\n placeholder=\"000000\"\n autoFocus\n />\n </label>\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading || code.length !== 6}>\n {loading ? 'Verifying...' : 'Verify & link'}\n </button>\n </form>\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => { setCodeSent(false); setCode(''); setError(''); }}>\n Use a different email\n </button>\n </div>\n </div>\n );\n}\n\n// ── Wallet Link Step ──\n\nfunction WalletLinkStep({ onBack, onSuccess, onFatalError }: { onBack?: () => void; onSuccess: () => void; onFatalError: (msg: string) => void }) {\n const { walletAdapter, config } = useForgeConnect();\n const { linkWallet } = useWallets();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [showOther, setShowOther] = useState(false);\n const [coldWallet, setColdWallet] = useState(false);\n const mobile = useMemo(() => isMobile(), []);\n const walletConfig = config.walletConfig;\n const preferred = walletConfig?.preferredWallets ?? [];\n const onlyPreferred = walletConfig?.onlyPreferred ?? false;\n\n const coldWalletRef = useRef(coldWallet);\n coldWalletRef.current = coldWallet;\n\n const buildSignTxFnForAdapter = useCallback((adapter: any): ((txBase64: string) => Promise<string>) | undefined => {\n if (!adapter.signTransaction) return undefined;\n const TxClass = walletConfig?.Transaction;\n if (!TxClass) return undefined;\n return async (txBase64: string) => {\n const bytes = Uint8Array.from(atob(txBase64), (c) => c.charCodeAt(0));\n const tx = TxClass.from(bytes);\n const signedTx = await adapter.signTransaction(tx);\n return btoa(String.fromCharCode(...new Uint8Array(signedTx.serialize())));\n };\n }, [walletConfig?.Transaction]);\n\n const wallet = walletAdapter!;\n\n const handleConnect = async (w: NonNullable<typeof walletAdapter>['wallets'][0]) => {\n if (w.readyState !== 'Installed') {\n if (mobile) {\n const mw = MOBILE_WALLETS.find((m) => m.name === w.adapter.name);\n if (mw) { window.location.href = mw.buildUrl(window.location.href); return; }\n }\n const url = (w.adapter as any).url;\n if (url) window.open(url, '_blank');\n return;\n }\n\n setError('');\n setLoading(true);\n try {\n // Select in React context (propagates wallet state to the rest of the app)\n wallet.select(w.adapter.name);\n\n // Connect via the raw adapter (select is async state — adapter is immediate)\n if (!w.adapter.connected) await (w.adapter as any).connect();\n\n const pk = w.adapter.publicKey;\n if (!pk) throw new Error('Wallet did not provide a public key.');\n const useCold = coldWalletRef.current;\n const adapterSignMessage = (w.adapter as any).signMessage\n ? (msg: Uint8Array) => (w.adapter as any).signMessage(msg)\n : undefined;\n await linkWallet(\n pk.toBase58(),\n useCold ? undefined : adapterSignMessage,\n 'solana',\n useCold ? buildSignTxFnForAdapter(w.adapter) : undefined,\n );\n onSuccess();\n } catch (err: unknown) {\n onFatalError(err instanceof Error ? err.message : 'Could not link this wallet. Please try again.');\n }\n };\n\n const { preferredWallets, otherWallets } = useMemo(() => {\n if (!walletAdapter) return { preferredWallets: [] as any[], otherWallets: [] as any[] };\n const all = walletAdapter.wallets;\n const prefList = preferred\n .map((name) => all.find((w) => w.adapter.name === name))\n .filter(Boolean) as typeof all;\n if (onlyPreferred && preferred.length > 0) return { preferredWallets: prefList, otherWallets: [] as typeof all };\n const prefSet = new Set(preferred);\n const others = all.filter((w) => !prefSet.has(w.adapter.name) && w.readyState === 'Installed');\n return { preferredWallets: prefList, otherWallets: others };\n }, [walletAdapter?.wallets, walletConfig]);\n\n const mobileExtraWallets = useMemo(() => {\n if (!mobile || !walletAdapter) return [];\n const adapterNames = new Set(walletAdapter.wallets.map((w) => w.adapter.name));\n return MOBILE_WALLETS.filter((mw) => !adapterNames.has(mw.name));\n }, [mobile, walletAdapter?.wallets]);\n\n // Mobile without wallet adapter — show deep links\n if (!walletAdapter && mobile) {\n return (\n <div className=\"fc-tab\">\n <div className=\"fc-wallet-list\">\n {MOBILE_WALLETS.map((mw) => (\n <button key={mw.name} type=\"button\" className=\"fc-btn fc-btn-wallet\"\n onClick={() => { window.location.href = mw.buildUrl(window.location.href); }}>\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-preferred\">Open app</span>\n </button>\n ))}\n </div>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n }\n\n // No wallet adapter at all\n if (!walletAdapter) {\n return (\n <div className=\"fc-tab\">\n <p className=\"fc-text\">\n No wallet adapter detected. Pass <code>walletAdapter</code> to{' '}\n <code>&lt;ForgeConnectProvider&gt;</code> to enable wallet connection.\n </p>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n {loading ? (\n <div style={{ textAlign: 'center', padding: '24px 0' }}>\n <p className=\"fc-tab-title\">Connecting...</p>\n <p className=\"fc-text\">\n {coldWallet\n ? 'Confirm the transaction on your device'\n : 'Approve the connection, then sign the verification request in your wallet'}\n </p>\n {error && (\n <>\n <p className=\"fc-error\">{error}</p>\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\"\n onClick={() => { setLoading(false); setError(''); }} style={{ marginTop: 8 }}>\n Try again\n </button>\n </>\n )}\n </div>\n ) : (\n <>\n <div className=\"fc-wallet-list\">\n {preferredWallets.map((w: any) => {\n const installed = w.readyState === 'Installed';\n return (\n <button key={w.adapter.name} type=\"button\" className=\"fc-btn fc-btn-wallet\" onClick={() => handleConnect(w)}>\n <span className={installed ? 'fc-installed-dot' : ''} style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n <span className=\"fc-badge-preferred\">Preferred</span>\n {!installed && mobile && MOBILE_WALLETS.some((mw) => mw.name === w.adapter.name)\n ? <span className=\"fc-badge-install\">Open app</span>\n : !installed && <span className=\"fc-badge-install\">Install</span>\n }\n </button>\n );\n })}\n {mobileExtraWallets.map((mw) => (\n <button key={mw.name} type=\"button\" className=\"fc-btn fc-btn-wallet\"\n onClick={() => { window.location.href = mw.buildUrl(window.location.href); }}>\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-install\">Open app</span>\n </button>\n ))}\n {otherWallets.length > 0 && !showOther && (\n <button type=\"button\" className=\"fc-btn fc-btn-wallet\" onClick={() => setShowOther(true)}>\n <span className=\"fc-other-wallets-icon\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 7h16\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"11\" y=\"10\" width=\"7\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </span>\n <span className=\"fc-wallet-name\">Other wallets</span>\n </button>\n )}\n {showOther && otherWallets.map((w: any) => (\n <button key={w.adapter.name} type=\"button\" className=\"fc-btn fc-btn-wallet\" onClick={() => handleConnect(w)}>\n <span className=\"fc-installed-dot\" style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n </button>\n ))}\n </div>\n {preferredWallets.length === 0 && otherWallets.length === 0 && mobileExtraWallets.length === 0 && (\n <p className=\"fc-text\">No wallet found. Please install a Solana wallet (like Phantom) to continue.</p>\n )}\n\n {walletConfig?.Transaction && (\n <label className=\"fc-cold-wallet-toggle\">\n <input\n type=\"checkbox\"\n checked={coldWallet}\n onChange={(e) => setColdWallet(e.target.checked)}\n />\n <span className=\"fc-toggle-track\" />\n <span className=\"fc-cold-wallet-label\">\n <span>Hardware wallet</span>\n <span>Ledger, Trezor, Keystone...</span>\n </span>\n </label>\n )}\n\n {error && <p className=\"fc-error\">{error}</p>}\n </>\n )}\n {!loading && onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Success View ──\n\nfunction SuccessView() {\n return (\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Linked</p>\n </div>\n );\n}\n","import { useForgeConnect } from '../hooks/use-forge-connect';\n\ninterface LoginButtonProps {\n className?: string;\n label?: string;\n}\n\nexport function LoginButton({ className, label }: LoginButtonProps) {\n const { auth, openModal, logout } = useForgeConnect();\n\n if (auth.status === 'loading') {\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} disabled>\n Loading...\n </button>\n );\n }\n\n if (auth.status === 'authenticated') {\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} onClick={logout}>\n {label ?? 'Log out'}\n </button>\n );\n }\n\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} onClick={openModal}>\n {label ?? 'Sign in'}\n </button>\n );\n}\n","import { useForgeConnect } from '../hooks/use-forge-connect.js';\n\ninterface AccountButtonProps {\n className?: string;\n loginLabel?: string;\n compact?: boolean;\n}\n\nexport function AccountButton({ className, loginLabel, compact }: AccountButtonProps) {\n const { auth, openModal, openAccountModal } = useForgeConnect();\n\n if (auth.status === 'loading') {\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} disabled>\n Loading...\n </button>\n );\n }\n\n if (auth.status === 'authenticated' && auth.user) {\n const user = auth.user;\n const initial = (user.displayName ?? user.primaryEmail ?? '?').charAt(0).toUpperCase();\n\n return (\n <button type=\"button\" className={className ?? 'fc-btn-account'} onClick={openAccountModal}>\n {user.avatarUrl ? (\n <img src={user.avatarUrl} alt=\"\" className=\"fc-account-avatar\" />\n ) : (\n <span className=\"fc-account-avatar-placeholder\">{initial}</span>\n )}\n {!compact && (\n <span>{user.displayName ?? user.primaryEmail ?? 'Account'}</span>\n )}\n </button>\n );\n }\n\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} onClick={openModal}>\n {loginLabel ?? 'Sign in'}\n </button>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { User, AdminUser, Session, PaginatedResponse, UserStatus } from '../types';\n\nexport function useAdmin() {\n const { api, getAccessToken } = useForgeConnect();\n const [users, setUsers] = useState<PaginatedResponse<User> | null>(null);\n const [selectedUser, setSelectedUser] = useState<AdminUser | null>(null);\n const [userSessions, setUserSessions] = useState<Session[] | null>(null);\n const [loading, setLoading] = useState(false);\n\n const listUsers = useCallback(\n async (params?: { page?: number; limit?: number; search?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminListUsers(token, params);\n setUsers(data);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const getUser = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetUser(token, id);\n setSelectedUser(data);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const updateUserStatus = useCallback(\n async (id: string, status: UserStatus) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminUpdateUserStatus(token, id, status);\n // Refresh user detail if viewing same user\n if (selectedUser?.id === id) {\n await getUser(id);\n }\n },\n [api, getAccessToken, selectedUser?.id, getUser],\n );\n\n const getUserSessions = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetUserSessions(token, id);\n setUserSessions(data);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const revokeUserSessions = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminRevokeUserSessions(token, id);\n setUserSessions([]);\n },\n [api, getAccessToken],\n );\n\n return {\n users,\n selectedUser,\n userSessions,\n loading,\n listUsers,\n getUser,\n updateUserStatus,\n getUserSessions,\n revokeUserSessions,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { Role, RoleUser, UserRoleAssignment, PermissionDomains } from '../types';\n\nexport function useRoles() {\n const { api, getAccessToken } = useForgeConnect();\n const [roles, setRoles] = useState<Role[] | null>(null);\n const [selectedRole, setSelectedRole] = useState<Role | null>(null);\n const [userRoleAssignments, setUserRoleAssignments] = useState<UserRoleAssignment[] | null>(null);\n const [roleUsers, setRoleUsers] = useState<RoleUser[] | null>(null);\n const [permissionDomains, setPermissionDomains] = useState<PermissionDomains | null>(null);\n const [myPermissions, setMyPermissions] = useState<string[]>([]);\n const [loading, setLoading] = useState(false);\n\n const listRoles = useCallback(\n async (tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminListRoles(token, tenantId);\n setRoles(data.data);\n return data.data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const getRoleUsers = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const data = await api.adminGetRoleUsers(token, id);\n setRoleUsers(data.data);\n return data.data;\n },\n [api, getAccessToken],\n );\n\n const getRole = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetRole(token, id);\n setSelectedRole(data);\n // Also fetch users assigned to this role\n getRoleUsers(id).catch(() => {});\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken, getRoleUsers],\n );\n\n const createRole = useCallback(\n async (data: { name: string; description?: string; permissions: string[]; tenantId?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const role = await api.adminCreateRole(token, data);\n // Refresh list\n await listRoles(data.tenantId);\n return role;\n },\n [api, getAccessToken, listRoles],\n );\n\n const updateRole = useCallback(\n async (id: string, data: { name?: string; description?: string; permissions?: string[] }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const role = await api.adminUpdateRole(token, id, data);\n setSelectedRole(role);\n return role;\n },\n [api, getAccessToken],\n );\n\n const deleteRole = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminDeleteRole(token, id);\n if (selectedRole?.id === id) setSelectedRole(null);\n },\n [api, getAccessToken, selectedRole?.id],\n );\n\n const getPermissions = useCallback(\n async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const data = await api.adminGetPermissions(token);\n setPermissionDomains(data.domains);\n return data.domains;\n },\n [api, getAccessToken],\n );\n\n /** Get the current user's own roles (no admin privileges needed). */\n const getMyRoles = useCallback(\n async (tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.getMyRoles(token, tenantId);\n setUserRoleAssignments(data.data);\n setMyPermissions(data.permissions ?? []);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const getUserRoles = useCallback(\n async (userId: string, tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetUserRoles(token, userId, tenantId);\n setUserRoleAssignments(data.data);\n return data.data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const assignRole = useCallback(\n async (userId: string, roleId: string, tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminAssignRole(token, userId, roleId, tenantId);\n },\n [api, getAccessToken],\n );\n\n const revokeRole = useCallback(\n async (userId: string, roleId: string, tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminRevokeRole(token, userId, roleId, tenantId);\n },\n [api, getAccessToken],\n );\n\n return {\n roles,\n selectedRole,\n roleUsers,\n userRoleAssignments,\n myPermissions,\n permissionDomains,\n loading,\n listRoles,\n getRole,\n getRoleUsers,\n createRole,\n updateRole,\n deleteRole,\n getPermissions,\n getMyRoles,\n getUserRoles,\n assignRole,\n revokeRole,\n };\n}\n","/**\n * Client-side permission checking utilities.\n * These mirror the server-side logic for UI gating.\n */\n\n/** Check if a single required permission is satisfied by any of the granted permissions. */\nexport function hasPermission(required: string, granted: string[]): boolean {\n for (const g of granted) {\n if (g === '*') return true;\n if (g === required) return true;\n if (g.endsWith(':*')) {\n const gDomain = g.slice(0, -2);\n const rDomain = required.split(':')[0];\n if (gDomain === rDomain) return true;\n }\n }\n return false;\n}\n\n/** Check that ALL required permissions are satisfied. */\nexport function hasAllPermissions(required: string[], granted: string[]): boolean {\n return required.every(r => hasPermission(r, granted));\n}\n\n/** Check that at least ONE of the required permissions is satisfied. */\nexport function hasAnyPermission(required: string[], granted: string[]): boolean {\n return required.some(r => hasPermission(r, granted));\n}\n"],"mappings":"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","names":["useState","useCallback","useEffect","useRef","useMemo","useState","jsx","jsxs","useState","useRef","jsx","jsxs","useState","useRef","useState","useRef","useRef","useEffect","jsx","jsx","jsxs","jsx","jsxs","useState","useRef","useState","jsx","jsxs","useState","useState","useRef","useEffect","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","Fragment","jsx","jsxs","useState","useState","useEffect","useRef","useCallback","useState","useCallback","useEffect","useRef","useState","useRef","useCallback","useEffect","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect","useState","useEffect","useCallback","jsx","jsxs","useState","useCallback","useEffect","useState","useEffect","jsx","jsxs","Fragment","jsx","jsxs","useState","useEffect","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useRef","useEffect","useCallback","useState","useEffect","useMemo","useRef","useCallback","Fragment","jsx","jsxs","useState","useEffect","SuccessView","EmailIcon","useMemo","useRef","useCallback","jsx","jsxs","useState","useRef","useCallback","useEffect","challengeId","res","useMemo","jsx","jsx","jsxs","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback"]}
1
+ {"version":3,"sources":["../src/provider.tsx","../src/context.ts","../src/api/client.ts","../src/utils.ts","../src/components/login-modal.tsx","../src/hooks/use-forge-connect.ts","../src/components/modal-overlay.tsx","../src/components/tabs/email-password.tsx","../src/resolve-config.ts","../src/components/tabs/email-otp.tsx","../src/components/tabs/wallet-connect.tsx","../src/components/svg-icon.tsx","../src/components/tabs/oauth-buttons.tsx","../src/components/tabs/forgot-password.tsx","../src/components/tabs/verify-2fa.tsx","../src/components/account-modal.tsx","../src/hooks/use-user.ts","../src/hooks/use-wallets.ts","../src/lib/utils.ts","../src/hooks/use-sessions.ts","../src/components/two-factor-modal.tsx","../src/components/passkeys-modal.tsx","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/bufferToBase64URLString.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/base64URLStringToBuffer.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/browserSupportsWebAuthn.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/toPublicKeyCredentialDescriptor.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/isValidDomain.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/webAuthnError.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/identifyRegistrationError.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/webAuthnAbortService.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/toAuthenticatorAttachment.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/methods/startRegistration.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/browserSupportsWebAuthnAutofill.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/identifyAuthenticationError.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/methods/startAuthentication.js","../src/components/password-modal.tsx","../src/components/error-view.tsx","../src/components/delete-account-modal.tsx","../src/components/link-auth-modal.tsx","../src/components/login-button.tsx","../src/components/account-button.tsx","../src/hooks/use-admin.ts","../src/hooks/use-roles.ts","../src/lib/permissions.ts"],"sourcesContent":["import { useState, useCallback, useEffect, useRef, useMemo, type ReactNode } from 'react';\nimport { ForgeConnectContext, type ForgeConnectContextValue, type WalletAdapterContext } from './context.js';\nimport { createApiClient, ForgeConnectApiError } from './api/client.js';\nimport type { AuthState, ModalState, AccountModalState, LinkModalState, ForgeConnectConfig, User, ModalStep } from './types.js';\nimport { getRefreshDelay } from './utils.js';\nimport { LoginModal } from './components/login-modal.js';\nimport { AccountModal } from './components/account-modal.js';\nimport { LinkAuthModal } from './components/link-auth-modal.js';\nimport { resolveLoginMethods, resolveInitialStep, isOAuthMethod } from './resolve-config.js';\nimport { startRegistration, startAuthentication } from './runtime-imports.js';\nimport { uint8ArrayToBase58 } from './lib/utils.js';\n\n// Module-level OAuth exchange cache. Each one-time code maps to its pending or resolved\n// exchange promise. The persistent provider (post-StrictMode-remount) re-awaits the same\n// promise so it sees the result even if the transient first mount kicked off the exchange.\ntype OAuthExchangeResult =\n | { kind: 'authenticated'; accessToken: string; user: User }\n | { kind: 'requires2FA'; challengeToken: string };\nconst oauthExchangeCache = new Map<string, Promise<OAuthExchangeResult | null>>();\n\ninterface ForgeConnectProviderProps {\n config: ForgeConnectConfig;\n children: ReactNode;\n /** Called when user successfully authenticates */\n onLogin?: (user: User) => void;\n /** Called when user logs out */\n onLogout?: () => void;\n /** Pass `useWallet()` from @solana/wallet-adapter-react to enable wallet login */\n walletAdapter?: WalletAdapterContext | null;\n}\n\nexport function ForgeConnectProvider({ config, children, onLogin, onLogout, walletAdapter }: ForgeConnectProviderProps) {\n const [auth, setAuth] = useState<AuthState>({\n status: 'loading',\n user: null,\n accessToken: null,\n });\n\n const [modal, setModal] = useState<ModalState>({\n isOpen: false,\n step: 'method-select',\n });\n\n const [accountModal, setAccountModal] = useState<AccountModalState>({ isOpen: false });\n const [linkModal, setLinkModal] = useState<LinkModalState>({ isOpen: false });\n const [challengeToken, setChallengeToken] = useState<string | null>(null);\n const [matricaMigration, setMatricaMigration] = useState<{\n token: string;\n matricaUsername: string | null;\n matricaDisplayName: string | null;\n conflicts: {\n wallets: { address: string }[];\n socials: { provider: 'twitter' | 'discord' | 'telegram'; externalName: string }[];\n email: { email: string } | null;\n };\n } | null>(null);\n\n const apiRef = useRef(createApiClient(config.apiUrl));\n const refreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const api = apiRef.current;\n\n // ── Token Refresh Scheduling ──\n\n const scheduleRefresh = useCallback((token: string) => {\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n const delay = getRefreshDelay(token);\n if (delay === null) return;\n\n refreshTimerRef.current = setTimeout(async () => {\n try {\n const { accessToken } = await api.refresh();\n setAuth((prev) => ({ ...prev, accessToken }));\n scheduleRefresh(accessToken);\n } catch {\n // Refresh failed — log user out\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n }\n }, delay);\n }, [api]);\n\n // ── Initialize from refresh cookie ──\n\n useEffect(() => {\n const init = async () => {\n try {\n const { accessToken } = await api.refresh();\n const user = await api.getMe(accessToken);\n setAuth({ status: 'authenticated', user, accessToken });\n scheduleRefresh(accessToken);\n } catch {\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n }\n };\n init();\n\n return () => {\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n };\n }, [api, scheduleRefresh]);\n\n // ── OAuth popup/callback handler ──\n\n useEffect(() => {\n // Check if THIS window is the OAuth callback popup\n if (window.location.pathname === '/fc-oauth-callback') {\n const params = new URLSearchParams(window.location.search);\n\n // Link callback — no token, just success flag\n if (params.get('fc_link_success') && window.opener) {\n window.opener.postMessage(\n { type: 'fc_oauth_link_success', provider: params.get('fc_provider') },\n window.location.origin,\n );\n window.close();\n return;\n }\n\n // Matrica migration callback — surface the pending migration to the parent\n const migrationToken = params.get('fc_migration');\n if (migrationToken) {\n try {\n localStorage.setItem('fc_matrica_migration_pending', migrationToken);\n } catch { /* ignore */ }\n if (window.opener) {\n window.opener.postMessage(\n { type: 'fc_matrica_migration', token: migrationToken },\n window.location.origin,\n );\n }\n window.close();\n return;\n }\n\n // Auth code callback — exchange code for tokens (prevents token leakage in URLs)\n const authCode = params.get('fc_code');\n if (authCode) {\n // Drop the code in localStorage as a fallback channel. The parent always picks it up\n // on next render even if the postMessage missed (StrictMode unmount window, popup\n // closed before parent listener registered, etc.).\n try {\n localStorage.setItem('fc_oauth_code_pending', authCode);\n } catch {\n // ignore (Safari private mode etc.)\n }\n if (window.opener) {\n window.opener.postMessage(\n { type: 'fc_oauth_code', code: authCode },\n window.location.origin,\n );\n }\n window.close();\n return;\n }\n }\n\n const handleCode = async (code: string) => {\n // Look up or start the exchange. Each code maps to a single shared promise.\n let exchangePromise = oauthExchangeCache.get(code);\n if (!exchangePromise) {\n try {\n localStorage.removeItem('fc_oauth_code_pending');\n } catch { /* ignore */ }\n exchangePromise = (async (): Promise<OAuthExchangeResult | null> => {\n try {\n const result = await api.exchangeOAuthCode(code);\n if (result.requires2FA && result.challengeToken) {\n return { kind: 'requires2FA', challengeToken: result.challengeToken };\n }\n const token = result.accessToken;\n if (!token) return null;\n const user = await api.getMe(token);\n return { kind: 'authenticated', accessToken: token, user };\n } catch {\n return null;\n }\n })();\n oauthExchangeCache.set(code, exchangePromise);\n }\n\n const outcome = await exchangePromise;\n if (!outcome) return;\n\n if (outcome.kind === 'requires2FA') {\n setChallengeToken(outcome.challengeToken);\n setModal({ isOpen: true, step: 'verify-2fa' });\n return;\n }\n\n setModal({ isOpen: true, step: 'success' });\n setAuth({ status: 'authenticated', user: outcome.user, accessToken: outcome.accessToken });\n scheduleRefresh(outcome.accessToken);\n onLogin?.(outcome.user);\n setTimeout(() => {\n setModal({ isOpen: false, step: 'method-select' });\n }, 1500);\n };\n\n const handleMigrationToken = async (token: string) => {\n try {\n localStorage.removeItem('fc_matrica_migration_pending');\n } catch { /* ignore */ }\n try {\n const preview = await api.getMatricaMigration(token);\n setMatricaMigration({ token, ...preview });\n setModal({ isOpen: true, step: 'matrica-migration' });\n } catch {\n setModal({ isOpen: true, step: 'error' });\n }\n };\n\n // Listen for messages from OAuth popup\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) return;\n if (event.data?.type === 'fc_oauth_code') {\n const code = event.data.code as string;\n if (code) void handleCode(code);\n return;\n }\n if (event.data?.type === 'fc_matrica_migration') {\n const token = event.data.token as string;\n if (token) void handleMigrationToken(token);\n }\n };\n\n // Fallback: listen for the popup's localStorage write (fires in this window too on same-origin)\n const handleStorage = (event: StorageEvent) => {\n if (event.key === 'fc_oauth_code_pending' && event.newValue) {\n void handleCode(event.newValue);\n return;\n }\n if (event.key === 'fc_matrica_migration_pending' && event.newValue) {\n void handleMigrationToken(event.newValue);\n }\n };\n\n // Sweep: on mount, pick up any code the popup may have left behind before the listener attached\n try {\n const pending = localStorage.getItem('fc_oauth_code_pending');\n if (pending) void handleCode(pending);\n const pendingMigration = localStorage.getItem('fc_matrica_migration_pending');\n if (pendingMigration) void handleMigrationToken(pendingMigration);\n } catch { /* ignore */ }\n\n window.addEventListener('message', handleMessage);\n window.addEventListener('storage', handleStorage);\n return () => {\n window.removeEventListener('message', handleMessage);\n window.removeEventListener('storage', handleStorage);\n };\n }, [api, config.apiUrl, scheduleRefresh, onLogin]);\n\n // ── Legacy config warning ──\n\n useEffect(() => {\n if (config.loginMethods && config.loginMethods.length > 0) {\n const hasLegacy = config.oauthProviders || config.walletLogin !== undefined || config.passwordlessLogin !== undefined;\n if (hasLegacy) {\n console.warn(\n '[ForgeConnect] Both loginMethods and legacy fields (oauthProviders, walletLogin, passwordlessLogin) are set. loginMethods takes precedence.',\n );\n }\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── Auth Actions ──\n\n const handleAuthSuccess = useCallback(\n async (token: string) => {\n const user = await api.getMe(token);\n setAuth({ status: 'authenticated', user, accessToken: token });\n scheduleRefresh(token);\n // Show success screen, then auto-close\n setModal({ isOpen: true, step: 'success' });\n onLogin?.(user);\n setTimeout(() => {\n setModal({ isOpen: false, step: 'method-select' });\n }, 1500);\n },\n [api, scheduleRefresh, onLogin],\n );\n\n const loginWithEmail = useCallback(\n async (email: string, password: string) => {\n const res = await api.login(email, password);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const register = useCallback(\n async (email: string, password: string, displayName?: string) => {\n await api.register(email, password, displayName);\n // Registration sends verification email, no token returned\n },\n [api],\n );\n\n const sendOtp = useCallback(\n async (email: string) => {\n await api.sendOtp(email);\n },\n [api],\n );\n\n const verifyOtp = useCallback(\n async (email: string, code: string) => {\n const res = await api.verifyOtp(email, code);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const loginWithWallet = useCallback(\n async (\n walletAddress: string,\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined,\n chain: string = 'solana',\n signTransaction?: (txBase64: string) => Promise<string>,\n ) => {\n // If signMessage is available, use the standard message-signing flow\n if (signMessage) {\n const { challengeId, message: challengeMessage } = await api.walletChallenge(walletAddress, chain);\n const message = new TextEncoder().encode(challengeMessage);\n const signatureBytes = await signMessage(message);\n const signature = chain === 'solana'\n ? uint8ArrayToBase58(signatureBytes)\n : Array.from(signatureBytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n const res = await api.walletVerify(challengeId, signature, walletAddress);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n return;\n }\n\n // Fallback: transaction-based signing (hardware wallets)\n if (!signTransaction) {\n throw new Error('Wallet does not support message signing or transaction signing.');\n }\n\n const { challengeId, transaction: txBase64 } = await api.walletChallengeTx(walletAddress, chain);\n const signedTxBase64 = await signTransaction(txBase64);\n\n const res = await api.walletVerifyTx(challengeId, signedTxBase64, walletAddress);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const loginWithOAuth = useCallback(\n (provider: string) => {\n const callbackUrl = `${config.apiUrl}/auth/oauth/${provider}`;\n const redirectUri = encodeURIComponent(window.location.origin + '/fc-oauth-callback');\n const url = `${callbackUrl}?redirect_uri=${redirectUri}`;\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.innerWidth - width) / 2;\n const top = window.screenY + (window.innerHeight - height) / 2;\n const popup = window.open(url, 'fc_oauth', `width=${width},height=${height},left=${left},top=${top}`);\n setModal({ isOpen: true, step: 'oauth' });\n\n // Poll for popup close — revert to method-select if user closes it\n if (popup) {\n const poll = setInterval(() => {\n if (popup.closed) {\n clearInterval(poll);\n setModal((prev) => prev.step === 'oauth' ? { isOpen: true, step: 'method-select' } : prev);\n }\n }, 500);\n }\n },\n [config.apiUrl],\n );\n\n const logout = useCallback(async () => {\n const token = auth.accessToken;\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n onLogout?.();\n if (token) {\n try {\n await api.logout(token);\n } catch {\n // Already logged out client-side\n }\n }\n }, [auth.accessToken, api, onLogout]);\n\n const forgotPassword = useCallback(\n async (email: string) => {\n await api.forgotPassword(email);\n },\n [api],\n );\n\n const resetPassword = useCallback(\n async (token: string, password: string) => {\n await api.resetPassword(token, password);\n },\n [api],\n );\n\n const verifyEmailToken = useCallback(\n async (token: string) => {\n const res = await api.verifyEmailToken(token);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal({ isOpen: true, step: 'verify-2fa' });\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const loginWithPasskey = useCallback(async () => {\n const { options, challengeKey } = await api.getPasskeyLoginOptions(config.webauthnRpId);\n const authResponse = await startAuthentication({ optionsJSON: options });\n const { accessToken } = await api.verifyPasskeyLogin(challengeKey, authResponse, config.webauthnRpId, config.webauthnOrigin);\n await handleAuthSuccess(accessToken);\n }, [api, handleAuthSuccess, config.webauthnRpId, config.webauthnOrigin]);\n\n const verify2FA = useCallback(async (code: string) => {\n if (!challengeToken) throw new Error('No 2FA challenge active');\n const { accessToken } = await api.verify2FA(challengeToken, code);\n setChallengeToken(null);\n await handleAuthSuccess(accessToken);\n }, [api, challengeToken, handleAuthSuccess]);\n\n const verifyRecoveryCode = useCallback(async (code: string) => {\n if (!challengeToken) throw new Error('No 2FA challenge active');\n const { accessToken } = await api.verifyRecoveryCode(challengeToken, code);\n setChallengeToken(null);\n await handleAuthSuccess(accessToken);\n }, [api, challengeToken, handleAuthSuccess]);\n\n const logoutAll = useCallback(async () => {\n const token = auth.accessToken;\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n onLogout?.();\n if (token) {\n try {\n await api.logoutAll(token);\n } catch {\n // Already logged out client-side\n }\n }\n }, [auth.accessToken, api, onLogout]);\n\n // ── Modal Actions ──\n\n const openModal = useCallback(() => {\n const methods = resolveLoginMethods(config);\n\n // Single OAuth method — fire popup directly, skip modal\n if (methods.length === 1 && isOAuthMethod(methods[0])) {\n loginWithOAuth(methods[0]);\n return;\n }\n\n // Default OAuth method — fire popup directly\n if (config.defaultLoginMethod && isOAuthMethod(config.defaultLoginMethod) && methods.includes(config.defaultLoginMethod)) {\n loginWithOAuth(config.defaultLoginMethod);\n return;\n }\n\n const step = resolveInitialStep(config, methods);\n setModal({ isOpen: true, step });\n }, [config, loginWithOAuth]);\n\n const closeModal = useCallback(() => {\n setModal({ isOpen: false, step: 'method-select' });\n }, []);\n\n const setModalStep = useCallback((step: ModalStep) => {\n setModal((prev) => ({ ...prev, step }));\n }, []);\n\n const openAccountModal = useCallback(() => {\n setAccountModal({ isOpen: true });\n }, []);\n\n const closeAccountModal = useCallback(() => {\n setAccountModal({ isOpen: false });\n }, []);\n\n const openLinkModal = useCallback((mode?: 'auth' | 'wallet') => {\n setLinkModal({ isOpen: true, mode: mode ?? 'auth' });\n }, []);\n\n const closeLinkModal = useCallback(() => {\n setLinkModal({ isOpen: false });\n }, []);\n\n const getAccessToken = useCallback(() => auth.accessToken, [auth.accessToken]);\n\n const resolveMatricaMigration = useCallback(async (migrate: boolean) => {\n if (!matricaMigration) return;\n const res = await api.resolveMatricaMigration(matricaMigration.token, migrate);\n setMatricaMigration(null);\n\n // Redirect-uri flow returns a one-time code; in-page flow returns tokens directly.\n let accessToken = res.accessToken ?? null;\n let requires2FA = res.requires2FA;\n let challenge = res.challengeToken;\n\n if (res.code) {\n const exchange = await api.exchangeOAuthCode(res.code);\n accessToken = exchange.accessToken ?? null;\n requires2FA = exchange.requires2FA;\n challenge = exchange.challengeToken;\n }\n\n if (requires2FA && challenge) {\n setChallengeToken(challenge);\n setModal({ isOpen: true, step: 'verify-2fa' });\n return;\n }\n if (accessToken) {\n await handleAuthSuccess(accessToken);\n }\n }, [api, matricaMigration, handleAuthSuccess]);\n\n // ── Context Value (memoized to avoid unnecessary re-renders) ──\n\n const value: ForgeConnectContextValue = useMemo(() => ({\n auth,\n modal,\n config,\n api,\n loginWithEmail,\n register,\n sendOtp,\n verifyOtp,\n loginWithWallet,\n loginWithOAuth,\n loginWithPasskey,\n logout,\n logoutAll,\n forgotPassword,\n resetPassword,\n verifyEmailToken,\n challengeToken,\n verify2FA,\n verifyRecoveryCode,\n matricaMigration,\n resolveMatricaMigration,\n openModal,\n closeModal,\n setModalStep,\n accountModal,\n openAccountModal,\n closeAccountModal,\n linkModal,\n openLinkModal,\n closeLinkModal,\n getAccessToken,\n walletAdapter: walletAdapter ?? null,\n }), [\n auth, modal, config, api, challengeToken, accountModal, linkModal,\n loginWithEmail, register, sendOtp, verifyOtp, loginWithWallet,\n loginWithOAuth, loginWithPasskey, logout, logoutAll, forgotPassword,\n resetPassword, verifyEmailToken, verify2FA, verifyRecoveryCode,\n matricaMigration, resolveMatricaMigration,\n openModal, closeModal, setModalStep, openAccountModal, closeAccountModal,\n openLinkModal, closeLinkModal, getAccessToken, walletAdapter,\n ]);\n\n return (\n <ForgeConnectContext.Provider value={value}>\n {children}\n <LoginModal />\n <AccountModal />\n <LinkAuthModal />\n </ForgeConnectContext.Provider>\n );\n}\n\n","import { createContext } from 'react';\nimport type { AuthState, ModalState, AccountModalState, LinkModalState, ForgeConnectConfig } from './types';\nimport type { ApiClient } from './api/client';\n\nexport interface ForgeConnectContextValue {\n // State\n auth: AuthState;\n modal: ModalState;\n config: ForgeConnectConfig;\n api: ApiClient;\n\n // Auth actions\n loginWithEmail: (email: string, password: string) => Promise<void>;\n register: (email: string, password: string, displayName?: string) => Promise<void>;\n sendOtp: (email: string) => Promise<void>;\n verifyOtp: (email: string, code: string) => Promise<void>;\n loginWithWallet: (walletAddress: string, signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined, chain?: string, signTransaction?: (txBase64: string) => Promise<string>) => Promise<void>;\n loginWithOAuth: (provider: string) => void;\n loginWithPasskey: () => Promise<void>;\n logout: () => Promise<void>;\n logoutAll: () => Promise<void>;\n forgotPassword: (email: string) => Promise<void>;\n resetPassword: (token: string, password: string) => Promise<void>;\n verifyEmailToken: (token: string) => Promise<void>;\n\n // 2FA\n challengeToken: string | null;\n verify2FA: (code: string) => Promise<void>;\n verifyRecoveryCode: (code: string) => Promise<void>;\n\n // Matrica migration\n matricaMigration: {\n token: string;\n matricaUsername: string | null;\n matricaDisplayName: string | null;\n conflicts: {\n wallets: { address: string }[];\n socials: { provider: 'twitter' | 'discord' | 'telegram'; externalName: string }[];\n email: { email: string } | null;\n };\n } | null;\n resolveMatricaMigration: (migrate: boolean) => Promise<void>;\n\n // Modal actions\n openModal: () => void;\n closeModal: () => void;\n setModalStep: (step: ModalState['step']) => void;\n\n // Account modal\n accountModal: AccountModalState;\n openAccountModal: () => void;\n closeAccountModal: () => void;\n\n // Link modal\n linkModal: LinkModalState;\n openLinkModal: (mode?: 'auth' | 'wallet') => void;\n closeLinkModal: () => void;\n\n // Token\n getAccessToken: () => string | null;\n\n // Wallet adapter (optional, injected by consumer)\n walletAdapter: WalletAdapterContext | null;\n}\n\nexport interface WalletAdapterContext {\n publicKey: { toBase58(): string } | null;\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined;\n signTransaction: ((transaction: any) => Promise<any>) | undefined;\n wallets: Array<{ adapter: { name: string; icon: string; connected: boolean; publicKey?: { toBase58(): string } | null }; readyState: string }>;\n select: (name: string) => void;\n connect: () => Promise<void>;\n}\n\nexport const ForgeConnectContext = createContext<ForgeConnectContextValue | null>(null);\n","import type { ApiErrorBody, User, AdminUser, Session, PaginatedResponse, UserStatus, TokenVerificationResult, WalletUserResult, TotpSetup, Passkey, Role, RoleUser, UserRoleAssignment, PermissionDomains } from '../types';\n\nexport class ForgeConnectApiError extends Error {\n public readonly status: number;\n public readonly code: string;\n\n constructor(status: number, code: string, message: string) {\n super(message);\n this.name = 'ForgeConnectApiError';\n this.status = status;\n this.code = code;\n }\n}\n\n// Module-level cache so StrictMode double-mount (or multiple provider instances pointing at the\n// same API) shares the same dedup singletons. Without this, each new client has its own\n// `inflightRefresh` and concurrent refreshes trip the server's reuse detection.\nconst clientCache = new Map<string, ReturnType<typeof buildApiClient>>();\n\nexport function createApiClient(apiUrl: string) {\n const base = apiUrl.replace(/\\/+$/, '');\n const cached = clientCache.get(base);\n if (cached) return cached;\n const client = buildApiClient(base);\n clientCache.set(base, client);\n return client;\n}\n\nfunction buildApiClient(base: string) {\n // Request deduplication: prevents duplicate concurrent requests\n const inflightRequests = new Map<string, Promise<any>>();\n\n // Singleton refresh promise — prevents concurrent refresh token rotation\n // which triggers reuse detection and revokes all sessions\n let inflightRefresh: Promise<any> | null = null;\n\n async function request<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n token?: string | null;\n } = {},\n ): Promise<T> {\n const { method = 'GET', body, token } = options;\n\n // Deduplicate concurrent refresh calls (critical: refresh rotates the token,\n // a second concurrent call with the old token triggers reuse detection)\n if (method === 'POST' && path === '/auth/refresh') {\n if (inflightRefresh) return inflightRefresh as Promise<T>;\n inflightRefresh = doRequest<T>(path, options).finally(() => {\n inflightRefresh = null;\n });\n return inflightRefresh as Promise<T>;\n }\n\n // Deduplicate identical concurrent GET requests\n if (method === 'GET' && token) {\n const dedupKey = `${path}:${token}`;\n const inflight = inflightRequests.get(dedupKey);\n if (inflight) return inflight as Promise<T>;\n const promise = doRequest<T>(path, options).finally(() => {\n inflightRequests.delete(dedupKey);\n });\n inflightRequests.set(dedupKey, promise);\n return promise;\n }\n\n return doRequest<T>(path, options);\n }\n\n async function doRequest<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n token?: string | null;\n } = {},\n ): Promise<T> {\n const { method = 'GET', body, token } = options;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const res = await fetch(`${base}${path}`, {\n method,\n headers,\n credentials: 'include',\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: ApiErrorBody;\n try {\n errorBody = await res.json() as ApiErrorBody;\n } catch {\n throw new ForgeConnectApiError(res.status, 'UNKNOWN', res.statusText);\n }\n throw new ForgeConnectApiError(res.status, errorBody.error.code, errorBody.error.message);\n }\n\n return res.json() as Promise<T>;\n }\n\n async function serviceRequest<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n serviceKey: string;\n },\n ): Promise<T> {\n const { method = 'GET', body, serviceKey } = options;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-service-key': serviceKey,\n };\n\n const res = await fetch(`${base}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: ApiErrorBody;\n try {\n errorBody = await res.json() as ApiErrorBody;\n } catch {\n throw new ForgeConnectApiError(res.status, 'UNKNOWN', res.statusText);\n }\n throw new ForgeConnectApiError(res.status, errorBody.error.code, errorBody.error.message);\n }\n\n return res.json() as Promise<T>;\n }\n\n return {\n // ── Auth: Email ──\n register(email: string, password: string, displayName?: string) {\n return request<{ success: true }>('/auth/email/register', {\n method: 'POST',\n body: { email, password, displayName },\n });\n },\n\n login(email: string, password: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string; user?: { id: string; displayName: string | null; email: string } }>(\n '/auth/email/login',\n { method: 'POST', body: { email, password } },\n );\n },\n\n sendOtp(email: string) {\n return request<{ success: true }>('/auth/email/send-code', {\n method: 'POST',\n body: { email },\n });\n },\n\n verifyOtp(email: string, code: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string; user?: { id: string; email: string } }>(\n '/auth/email/verify-code',\n { method: 'POST', body: { email, code } },\n );\n },\n\n // ── Auth: Wallet ──\n walletChallenge(walletAddress: string, chain: string = 'solana') {\n return request<{ challengeId: string; message: string }>('/auth/wallet/challenge', {\n method: 'POST',\n body: { walletAddress, chain },\n });\n },\n\n walletVerify(challengeId: string, signature: string, walletAddress: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string }>('/auth/wallet/verify', {\n method: 'POST',\n body: { challengeId, signature, walletAddress },\n });\n },\n\n walletChallengeTx(walletAddress: string, chain: string = 'solana') {\n return request<{ challengeId: string; transaction: string }>('/auth/wallet/challenge-tx', {\n method: 'POST',\n body: { walletAddress, chain },\n });\n },\n\n walletVerifyTx(challengeId: string, signedTransaction: string, walletAddress: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string }>('/auth/wallet/verify-tx', {\n method: 'POST',\n body: { challengeId, signedTransaction, walletAddress },\n });\n },\n\n // ── Auth: OAuth ──\n exchangeOAuthCode(code: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string; userId?: string }>('/auth/oauth/exchange', {\n method: 'POST',\n body: { code },\n });\n },\n\n getMatricaMigration(token: string) {\n return request<{\n matricaUsername: string | null;\n matricaDisplayName: string | null;\n conflicts: {\n wallets: { address: string }[];\n socials: { provider: 'twitter' | 'discord' | 'telegram'; externalName: string }[];\n email: { email: string } | null;\n };\n }>(`/auth/oauth/matrica/migration/${encodeURIComponent(token)}`);\n },\n\n resolveMatricaMigration(token: string, migrate: boolean) {\n return request<{\n code?: string;\n accessToken?: string;\n requires2FA?: boolean;\n challengeToken?: string;\n }>(`/auth/oauth/matrica/migration/${encodeURIComponent(token)}/resolve`, {\n method: 'POST',\n body: { migrate },\n });\n },\n\n createLinkIntent(token: string) {\n return request<{ intentToken: string }>('/auth/oauth/link-intent', {\n method: 'POST',\n token,\n });\n },\n\n // ── Auth: Session ──\n refresh() {\n return request<{ accessToken: string }>('/auth/refresh', { method: 'POST' });\n },\n\n logout(token: string) {\n return request<{ success: true }>('/auth/logout', { method: 'POST', token });\n },\n\n logoutAll(token: string) {\n return request<{ success: true }>('/auth/logout-all', { method: 'POST', token });\n },\n\n // ── User ──\n getMe(token: string) {\n return request<{ id: string; displayName: string | null; avatarUrl: string | null; primaryEmail: string | null; status: string; createdAt: string; updatedAt: string }>(\n '/users/me',\n { token },\n );\n },\n\n updateMe(token: string, data: { displayName?: string; avatarUrl?: string }) {\n return request<{ id: string; displayName: string | null; avatarUrl: string | null; primaryEmail: string | null; status: string; createdAt: string; updatedAt: string }>(\n '/users/me',\n { method: 'PATCH', token, body: data },\n );\n },\n\n setPassword(token: string, newPassword: string, currentPassword?: string) {\n return request<{ success: true }>('/users/me/password', {\n method: 'POST',\n token,\n body: { newPassword, ...(currentPassword ? { currentPassword } : {}) },\n });\n },\n\n getAuthMethods(token: string) {\n return request<Array<{ id: string; provider: string; providerId: string; providerUsername: string | null; isVerified: boolean; verifiedAt: string | null; createdAt: string }>>(\n '/users/me/auth-methods',\n { token },\n );\n },\n\n linkAuthMethod(token: string, data: { provider: string; email?: string; password?: string; challengeId?: string; signature?: string; signedTransaction?: string; walletAddress?: string }) {\n return request<{ success: true }>('/users/me/auth-methods', {\n method: 'POST',\n token,\n body: data,\n });\n },\n\n linkOtpSend(token: string, email: string) {\n return request<{ success: true }>('/users/me/auth-methods/otp/send', {\n method: 'POST',\n token,\n body: { email },\n });\n },\n\n linkOtpVerify(token: string, email: string, code: string) {\n return request<{ success: true }>('/users/me/auth-methods/otp/verify', {\n method: 'POST',\n token,\n body: { email, code },\n });\n },\n\n unlinkAuthMethod(token: string, id: string) {\n return request<{ success: true }>(`/users/me/auth-methods/${id}`, {\n method: 'DELETE',\n token,\n });\n },\n\n getWallets(token: string) {\n return request<Array<{ id: string; userId: string; chain: string; address: string; label: string | null; isPrimary: boolean; verifiedAt: string | null; lastUsedAt: string | null }>>(\n '/users/me/wallets',\n { token },\n );\n },\n\n updateWallet(token: string, id: string, data: { label?: string; isPrimary?: boolean }) {\n return request<{ id: string; userId: string; chain: string; address: string; label: string | null; isPrimary: boolean; verifiedAt: string | null; lastUsedAt: string | null }>(\n `/users/me/wallets/${id}`,\n { method: 'PATCH', token, body: data },\n );\n },\n\n getSessions(token: string) {\n return request<Array<{ id: string; createdAt: string; expiresAt: string; lastActiveAt: string; deviceInfo: Record<string, unknown> | null; ipAddress: string }>>(\n '/users/me/sessions',\n { token },\n );\n },\n\n revokeSession(token: string, id: string) {\n return request<{ success: true }>(`/users/me/sessions/${id}`, {\n method: 'DELETE',\n token,\n });\n },\n\n // ── Auth: Email Verification & Password Reset ──\n verifyEmailToken(token: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string }>('/auth/email/verify', {\n method: 'POST',\n body: { token },\n });\n },\n\n forgotPassword(email: string) {\n return request<{ success: true }>('/auth/email/forgot-password', {\n method: 'POST',\n body: { email },\n });\n },\n\n resetPassword(token: string, password: string) {\n return request<{ success: true }>('/auth/email/reset-password', {\n method: 'POST',\n body: { token, password },\n });\n },\n\n // ── 2FA ──\n get2FAStatus(token: string) {\n return request<{ enabled: boolean }>('/users/me/2fa/status', { token });\n },\n\n setup2FA(token: string) {\n return request<TotpSetup>('/users/me/2fa/setup', { method: 'POST', token });\n },\n\n enable2FA(token: string, code: string) {\n return request<{ success: true }>('/users/me/2fa/enable', { method: 'POST', token, body: { code } });\n },\n\n disable2FA(token: string, code: string) {\n return request<{ success: true }>('/users/me/2fa', { method: 'DELETE', token, body: { code } });\n },\n\n verify2FA(challengeToken: string, code: string) {\n return request<{ accessToken: string }>('/auth/2fa/verify', { method: 'POST', body: { challengeToken, code } });\n },\n\n verifyRecoveryCode(challengeToken: string, code: string) {\n return request<{ accessToken: string }>('/auth/2fa/verify-recovery', { method: 'POST', body: { challengeToken, code } });\n },\n\n regenerateRecoveryCodes(token: string, code: string) {\n return request<{ recoveryCodes: string[] }>('/users/me/2fa/recovery-codes', { method: 'POST', token, body: { code } });\n },\n\n // ── Passkeys ──\n getPasskeys(token: string) {\n return request<Passkey[]>('/users/me/passkeys', { token });\n },\n\n getPasskeyRegisterOptions(token: string, rpId?: string, origin?: string) {\n return request<{ options: any; challengeKey: string }>('/auth/passkeys/register/options', { method: 'POST', token, body: { rpId, origin } });\n },\n\n verifyPasskeyRegistration(token: string, challengeKey: string, response: any, name?: string, rpId?: string, origin?: string) {\n return request<Passkey>('/auth/passkeys/register/verify', { method: 'POST', token, body: { challengeKey, response, name, rpId, origin } });\n },\n\n getPasskeyLoginOptions(rpId?: string) {\n return request<{ options: any; challengeKey: string }>('/auth/passkeys/login/options', { method: 'POST', body: { rpId } });\n },\n\n verifyPasskeyLogin(challengeKey: string, response: any, rpId?: string, origin?: string) {\n return request<{ accessToken: string }>('/auth/passkeys/login/verify', { method: 'POST', body: { challengeKey, response, rpId, origin } });\n },\n\n renamePasskey(token: string, id: string, name: string) {\n return request<Passkey>(`/users/me/passkeys/${id}`, { method: 'PATCH', token, body: { name } });\n },\n\n deletePasskey(token: string, id: string) {\n return request<{ success: true }>(`/users/me/passkeys/${id}`, { method: 'DELETE', token });\n },\n\n // ── Account Deletion ──\n requestAccountDeletion(token: string) {\n return request<{ requiresVerification: boolean }>('/users/me/delete-request', {\n method: 'POST',\n token,\n });\n },\n\n confirmAccountDeletion(token: string, code?: string) {\n return request<{ success: true }>('/users/me/delete-confirm', {\n method: 'POST',\n token,\n body: code ? { code } : {},\n });\n },\n\n // ── Admin ──\n adminListUsers(token: string, params?: { page?: number; limit?: number; search?: string }) {\n const query = new URLSearchParams();\n if (params?.page) query.set('page', String(params.page));\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.search) query.set('search', params.search);\n const qs = query.toString();\n return request<PaginatedResponse<User>>(`/admin/users${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminGetUser(token: string, id: string) {\n return request<AdminUser>(`/admin/users/${id}`, { token });\n },\n\n adminUpdateUserStatus(token: string, id: string, status: UserStatus) {\n return request<{ success: true }>(`/admin/users/${id}/status`, {\n method: 'PATCH',\n token,\n body: { status },\n });\n },\n\n adminGetUserSessions(token: string, id: string) {\n return request<Session[]>(`/admin/users/${id}/sessions`, { token });\n },\n\n adminRevokeUserSessions(token: string, id: string) {\n return request<{ success: true }>(`/admin/users/${id}/sessions`, {\n method: 'DELETE',\n token,\n });\n },\n\n // ── Roles ──\n adminListRoles(token: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ data: Role[] }>(`/admin/roles${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminGetRole(token: string, id: string) {\n return request<Role>(`/admin/roles/${id}`, { token });\n },\n\n adminGetRoleUsers(token: string, id: string) {\n return request<{ data: RoleUser[] }>(`/admin/roles/${id}/users`, { token });\n },\n\n adminCreateRole(token: string, data: { name: string; description?: string; permissions: string[]; tenantId?: string }) {\n return request<Role>('/admin/roles', { method: 'POST', token, body: data });\n },\n\n adminUpdateRole(token: string, id: string, data: { name?: string; description?: string; permissions?: string[] }) {\n return request<Role>(`/admin/roles/${id}`, { method: 'PATCH', token, body: data });\n },\n\n adminDeleteRole(token: string, id: string) {\n return request<{ success: true }>(`/admin/roles/${id}`, { method: 'DELETE', token });\n },\n\n adminGetPermissions(token: string) {\n return request<{ domains: PermissionDomains }>('/admin/roles/permissions', { token });\n },\n\n /** Get the current user's own roles (no admin privileges needed). */\n getMyRoles(token: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ data: UserRoleAssignment[]; permissions: string[] }>(`/users/me/roles${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminGetUserRoles(token: string, userId: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ data: UserRoleAssignment[] }>(`/admin/users/${userId}/roles${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminAssignRole(token: string, userId: string, roleId: string, tenantId?: string) {\n return request<{ success: true }>(`/admin/users/${userId}/roles`, {\n method: 'POST',\n token,\n body: { roleId, ...(tenantId ? { tenantId } : {}) },\n });\n },\n\n adminRevokeRole(token: string, userId: string, roleId: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ success: true }>(`/admin/users/${userId}/roles/${roleId}${qs ? `?${qs}` : ''}`, {\n method: 'DELETE',\n token,\n });\n },\n\n // ── Service ──\n serviceVerifyToken(serviceKey: string, accessToken: string, tenantId?: string) {\n return serviceRequest<TokenVerificationResult>('/service/verify-token', {\n method: 'POST',\n serviceKey,\n body: { token: accessToken, ...(tenantId ? { tenantId } : {}) },\n });\n },\n\n serviceUserByWallet(serviceKey: string, walletAddress: string, chain?: string) {\n return serviceRequest<WalletUserResult>('/service/user-by-wallet', {\n method: 'POST',\n serviceKey,\n body: { walletAddress, chain },\n });\n },\n };\n}\n\nexport type ApiClient = ReturnType<typeof createApiClient>;\n","interface DecodedJWT {\n sub: string;\n tid?: string;\n scopes: string[];\n iat?: number;\n exp?: number;\n}\n\nexport function decodeJWT(token: string): DecodedJWT | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const payload = JSON.parse(atob(parts[1].replace(/-/g, '+').replace(/_/g, '/')));\n return payload as DecodedJWT;\n } catch {\n return null;\n }\n}\n\n/**\n * Returns milliseconds until 80% of the token's TTL has elapsed.\n * Returns null if the token cannot be decoded or has no exp.\n */\nexport function getRefreshDelay(token: string): number | null {\n const decoded = decodeJWT(token);\n if (!decoded?.exp || !decoded.iat) return null;\n const ttl = (decoded.exp - decoded.iat) * 1000;\n const elapsed = Date.now() - decoded.iat * 1000;\n const delay = ttl * 0.8 - elapsed;\n return delay > 0 ? delay : 0;\n}\n","import { useState, type ReactNode } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { EmailLoginForm, EmailRegisterForm } from './tabs/email-password.js';\nimport { EmailOtpForm } from './tabs/email-otp.js';\nimport { WalletConnectForm } from './tabs/wallet-connect.js';\nimport { ForgotPasswordForm } from './tabs/forgot-password.js';\nimport { Verify2FAForm } from './tabs/verify-2fa.js';\nimport { OAuthButton } from './tabs/oauth-buttons.js';\nimport { SvgIcon } from './svg-icon.js';\nimport { resolveLoginMethods, isOAuthMethod } from '../resolve-config.js';\nimport type { LoginMethod } from '../types.js';\n\nexport function LoginModal() {\n const { modal, closeModal, config } = useForgeConnect();\n\n const renderStep = () => {\n switch (modal.step) {\n case 'email-login':\n return <EmailLoginForm />;\n case 'email-register':\n return <EmailRegisterForm />;\n case 'email-otp':\n return <EmailOtpForm />;\n case 'wallet-connect':\n return <WalletConnectForm />;\n case 'forgot-password':\n return <ForgotPasswordForm />;\n case 'verify-2fa':\n return <Verify2FAForm />;\n case 'matrica-migration':\n return <MatricaMigrationView />;\n case 'oauth':\n return <OAuthLoadingView />;\n case 'success':\n return <SuccessView />;\n case 'method-select':\n default:\n return <MethodSelect />;\n }\n };\n\n const renderLogo = () => {\n if (config.appearance?.logoNode) {\n return <div className=\"fc-logo\">{config.appearance.logoNode as ReactNode}</div>;\n }\n if (config.appearance?.logo) {\n return <img src={config.appearance.logo} alt=\"\" className=\"fc-logo\" />;\n }\n return null;\n };\n\n return (\n <ModalOverlay isOpen={modal.isOpen} onClose={closeModal}>\n <div\n className=\"fc-modal-content\"\n style={{\n '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6',\n } as React.CSSProperties}\n data-theme={config.appearance?.theme ?? 'light'}\n >\n {modal.step === 'success' || modal.step === 'oauth' || modal.step === 'matrica-migration' ? (\n renderStep()\n ) : (\n <>\n {renderLogo()}\n\n <h2 className=\"fc-modal-title\">\n {config.appearance?.title ?? 'Log in or sign up'}\n </h2>\n {renderStep()}\n {(config.appearance?.termsUrl || config.appearance?.privacyUrl) && (\n <p className=\"fc-legal\">\n By continuing, you agree to our{' '}\n {config.appearance.termsUrl && (\n <a href={config.appearance.termsUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"fc-legal-link\">Terms</a>\n )}\n {config.appearance.termsUrl && config.appearance.privacyUrl && ' and '}\n {config.appearance.privacyUrl && (\n <a href={config.appearance.privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"fc-legal-link\">Privacy Policy</a>\n )}\n </p>\n )}\n <NomuPill />\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n\n// ── Icons ──\n\nconst EmailIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\nconst OtpIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"3\" y=\"6\" width=\"14\" height=\"9\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"6.5\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"10\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"13.5\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" />\n </svg>\n </div>\n);\n\nconst WalletIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </div>\n);\n\nconst PasskeyIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <circle cx=\"8\" cy=\"7\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M13 13.5a5 5 0 0 0-10 0\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M15 10v4m0 0l-1.5-1m1.5 1l1.5-1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n);\n\nconst LoadingSpinner = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon fc-spin\">\n <path d=\"M10 2a8 8 0 0 1 8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\n// ── Method Select ──\n\nfunction MethodSelect() {\n const { setModalStep, loginWithPasskey, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const [passkeyLoading, setPasskeyLoading] = useState(false);\n const [passkeyError, setPasskeyError] = useState('');\n\n const handlePasskey = async () => {\n setPasskeyLoading(true);\n setPasskeyError('');\n try {\n await loginWithPasskey();\n } catch (err: unknown) {\n setPasskeyError(err instanceof Error ? err.message : 'Passkey authentication failed.');\n } finally {\n setPasskeyLoading(false);\n }\n };\n\n // Build elements in config order, grouping consecutive OAuth providers\n const elements: ReactNode[] = [];\n let i = 0;\n\n while (i < methods.length) {\n const method = methods[i];\n\n if (isOAuthMethod(method)) {\n // Collect consecutive OAuth providers\n const oauthGroup: LoginMethod[] = [];\n while (i < methods.length && isOAuthMethod(methods[i])) {\n oauthGroup.push(methods[i]);\n i++;\n }\n\n // Add divider before OAuth group if there were non-OAuth elements before\n if (elements.length > 0) {\n elements.push(<div key={`div-before-${oauthGroup[0]}`} className=\"fc-divider\"><span>or</span></div>);\n }\n\n elements.push(\n <div key={`oauth-${oauthGroup.join('-')}`} className=\"fc-oauth-group\">\n {oauthGroup.map((p) => (\n <OAuthButton key={p} provider={p as any} />\n ))}\n </div>,\n );\n } else {\n // Add divider after an OAuth group\n if (elements.length > 0) {\n const prev = methods[i - 1];\n if (prev && isOAuthMethod(prev)) {\n elements.push(<div key={`div-after-${prev}`} className=\"fc-divider\"><span>or</span></div>);\n }\n }\n\n switch (method) {\n case 'email':\n elements.push(\n <button key=\"email\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={() => setModalStep('email-login')}>\n <EmailIcon /> <span className=\"fc-btn-name\">Password</span>\n </button>,\n );\n break;\n case 'otp':\n elements.push(\n <button key=\"otp\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={() => setModalStep('email-otp')}>\n <OtpIcon /> <span className=\"fc-btn-name\">Magic code</span>\n </button>,\n );\n break;\n case 'wallet':\n elements.push(\n <button key=\"wallet\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={() => setModalStep('wallet-connect')}>\n <WalletIcon /> <span className=\"fc-btn-name\">Wallet</span>\n </button>,\n );\n break;\n case 'passkey':\n elements.push(\n <button key=\"passkey\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={handlePasskey} disabled={passkeyLoading}>\n {passkeyLoading ? <LoadingSpinner /> : <PasskeyIcon />}\n <span className=\"fc-btn-name\">{passkeyLoading ? 'Waiting for passkey...' : 'Passkey'}</span>\n </button>,\n );\n break;\n }\n i++;\n }\n }\n\n return (\n <div className=\"fc-method-select\">\n {passkeyError && <p className=\"fc-error\">{passkeyError}</p>}\n {elements}\n </div>\n );\n}\n\n// ── OAuth Loading View ──\n\nfunction OAuthLoadingView() {\n const { setModalStep } = useForgeConnect();\n\n return (\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg width=\"52\" height=\"52\" viewBox=\"0 0 52 52\" className=\"fc-spin\">\n <circle cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" stroke=\"var(--fc-accent, #8b5cf6)\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeDasharray=\"100\" strokeDashoffset=\"30\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Completing sign in...</p>\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" style={{ marginTop: '16px' }} onClick={() => setModalStep('method-select')}>\n Cancel\n </button>\n </div>\n );\n}\n\n// ── Nomu Trust Pill ──\n\nconst NOMU_LOGO = '<svg viewBox=\"0 0 466 115\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-label=\"Nomu\"><path d=\"M86.1037 1.64399C89.2226 2.96692 92.9067 6.05804 94.8954 8.90299C101.195 17.9195 103.263 31.5362 105.652 42.3487C108.921 57.1343 113.078 73.2835 111.843 88.981C111.25 96.5118 107.934 104.178 100.485 106.907C78.5857 114.928 68.4753 94.3605 55.5778 81.0755C54.0151 79.4657 49.9264 75.4498 48.017 74.7242C45.1699 73.6431 46.4243 77.2266 46.9038 78.6202C48.9075 84.4342 52.7842 89.1608 55.1111 94.4333C58.2322 101.506 56.3335 109.491 48.9353 112.563C38.6837 116.818 24.7051 108.932 18.1076 100.994C9.79754 90.9975 3.49328 72.2174 1.14497 59.3049C-1.5908 44.2668 -0.458383 24.9194 16.2003 18.5938C32.7091 12.3216 46.9723 35.7212 56.8964 45.2451C58.5169 46.8013 61.9677 50.9392 63.3912 46.949C64.6285 43.4833 63.6652 36.0102 63.4983 32.0543C62.9845 19.8418 61.3918 -1.3144 79.4334 0.0641835C81.3279 0.209749 84.3483 0.899043 86.1015 1.64399H86.1037Z\"/><path d=\"M198.265 10.0303C208.463 15.8037 214.843 26.2244 217.82 37.2467C220.237 46.1968 221.048 56.7482 219.807 66.1799C216.628 90.3223 200.149 109.849 174.493 110.988C157.695 111.733 139.746 105.682 131.472 90.1896C118.984 66.8071 137.597 43.8678 152.329 27.1128C164.501 13.2691 178.368 -1.23604 198.265 10.0303ZM175.364 41.9176C169.771 38.1072 164.25 44.1996 162.46 49.0803C159.339 57.5916 160.988 72.0346 172.766 71.1591C180.16 70.609 181.427 61.1108 181.02 55.2047C180.752 51.3451 178.7 44.1867 175.364 41.9155V41.9176Z\"/><path d=\"M324.975 3.83292C329.706 5.77236 335.978 13.6051 338.509 17.8479C348.347 34.3438 351.002 53.6547 350.321 73.0085C349.884 85.4008 348.086 102.122 337.415 109.993C321.938 121.407 304.25 107.993 308.199 89.9711C308.681 87.7705 309.725 85.6213 310.52 83.5555C311.913 79.9293 311.83 74.2415 310.92 70.2556C310.903 70.1807 310.614 69.4079 310.483 68.9476C309.62 65.8737 307.548 61.6908 303.712 63.5468C302.409 64.1783 300.839 66.2162 299.022 67.096C292.491 70.2577 283.616 65.5697 280.37 59.4559C279.444 57.707 277.958 52.7728 276.322 51.9444C274.342 50.9425 273.617 52.8948 273.09 54.4382C271.587 58.8437 271.701 66.5394 273.096 71.2232C273.957 74.1088 275.809 76.866 276.92 79.6103C281.115 89.9733 285.647 107.621 270.934 111.791C262.391 114.212 256.003 109.961 250.756 103.888C231.165 81.2072 230.598 47.9049 244.878 21.7289C250.014 12.3142 256.371 6.06777 268.012 6.30967C275.396 6.4638 279.829 10.469 283.241 16.5442C285.532 20.62 287.7 25.1582 290.905 28.7995C293.204 31.4111 296.462 34.0398 299.778 31.2077C303.727 27.8362 305.846 18.0876 308.505 13.2219C311.802 7.18948 317.203 0.649749 324.973 3.83292H324.975Z\"/><path d=\"M452.977 13.4681C459.921 19.2693 464.095 29.0907 465.288 37.8695C468.466 61.282 454.854 98.4611 432.55 109.468C421.31 115.015 406.192 112.904 394.569 109.445C375.919 103.894 364.978 87.4109 363.803 68.2841C362.775 51.5612 371.925 30.2787 381.817 17.15C388.977 7.64763 404.21 11.5072 408.836 21.3243C411.705 27.4124 409.059 30.8824 406.488 36.0436C430.727 62.0334 432.463 57.1377 431.208 47.5453C429.772 36.5723 421.213 13.8256 437.17 9.58065C442.973 8.03724 448.492 9.72193 452.977 13.4681Z\"/></svg>';\n\nfunction NomuPill() {\n return (\n <div className=\"fc-nomu-wrap\">\n <a\n href=\"https://www.nomu.dev/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"fc-nomu-pill\"\n >\n <span>Powered by</span>\n <SvgIcon svg={NOMU_LOGO} className=\"fc-nomu-logo\" />\n </a>\n </div>\n );\n}\n\n// ── Matrica Migration View ──\n\nconst MigrationIcons = {\n wallet: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.6\" />\n <rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.6\" />\n </svg>\n ),\n email: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.6\" />\n <path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n ),\n twitter: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n ),\n discord: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M20.317 4.37a19.79 19.79 0 0 0-4.885-1.515.07.07 0 0 0-.073.035c-.21.375-.444.864-.608 1.249a18.27 18.27 0 0 0-5.487 0a12.6 12.6 0 0 0-.617-1.25.07.07 0 0 0-.073-.034A19.74 19.74 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.08.08 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03.08.08 0 0 0 .084-.028a14.1 14.1 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106a13.1 13.1 0 0 1-1.872-.892.077.077 0 0 1-.008-.128a10 10 0 0 0 .372-.292.07.07 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.07.07 0 0 1 .078.01q.181.149.373.292a.077.077 0 0 1-.006.127a12.3 12.3 0 0 1-1.873.893.077.077 0 0 0-.041.107a16 16 0 0 0 1.226 1.993.08.08 0 0 0 .084.028a19.84 19.84 0 0 0 6.002-3.03.08.08 0 0 0 .031-.056c.5-5.177-.838-9.673-3.549-13.66a.06.06 0 0 0-.031-.028M8.02 15.331c-1.182 0-2.157-1.086-2.157-2.419c0-1.332.956-2.418 2.157-2.418c1.21 0 2.176 1.096 2.157 2.418c0 1.333-.956 2.42-2.157 2.42m7.974 0c-1.183 0-2.157-1.086-2.157-2.419c0-1.332.955-2.418 2.157-2.418c1.21 0 2.176 1.096 2.157 2.418c0 1.333-.946 2.42-2.157 2.42\" />\n </svg>\n ),\n telegram: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12a12 12 0 0 0 12-12A12 12 0 0 0 12 0zm4.962 7.224c.1-.002.321.023.465.14a.5.5 0 0 1 .171.325c.016.093.036.306.02.472c-.18 1.898-.962 6.502-1.36 8.627c-.168.9-.499 1.201-.82 1.23c-.696.065-1.225-.46-1.9-.902c-1.056-.693-1.653-1.124-2.678-1.8c-1.185-.78-.417-1.21.258-1.91c.177-.184 3.247-2.977 3.307-3.23c.007-.032.014-.15-.056-.212s-.174-.041-.249-.024q-.16.036-5.061 3.345q-.72.495-1.302.48c-.428-.008-1.252-.241-1.865-.44c-.752-.245-1.349-.374-1.297-.789q.04-.324.893-.663q5.247-2.286 6.998-3.014q3.333-1.386 4.025-1.627q.227-.078.378-.08\" />\n </svg>\n ),\n};\n\nfunction MatricaMigrationView() {\n const { matricaMigration, resolveMatricaMigration } = useForgeConnect();\n const [loading, setLoading] = useState<null | 'migrate' | 'skip'>(null);\n const [error, setError] = useState('');\n\n if (!matricaMigration) return null;\n const { conflicts } = matricaMigration;\n const total = conflicts.wallets.length + conflicts.socials.length + (conflicts.email ? 1 : 0);\n\n const handle = async (migrate: boolean) => {\n setLoading(migrate ? 'migrate' : 'skip');\n setError('');\n try {\n await resolveMatricaMigration(migrate);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Something went wrong.');\n setLoading(null);\n }\n };\n\n const truncate = (s: string, n = 6) => (s.length > n * 2 + 1 ? `${s.slice(0, n)}…${s.slice(-n)}` : s);\n\n return (\n <div className=\"fc-mig\">\n <div className=\"fc-mig-hero\">\n <h2 className=\"fc-modal-title\" style={{ margin: 0 }}>Account already linked</h2>\n <p className=\"fc-mig-sub\">\n Move {total} {total > 1 ? 'accounts' : 'account'} to Matrica?\n </p>\n </div>\n\n <ul className=\"fc-mig-list\">\n {conflicts.wallets.map((w) => (\n <li key={`w-${w.address}`} className=\"fc-mig-item\">\n <span className=\"fc-mig-ic\">{MigrationIcons.wallet}</span>\n <span className=\"fc-mig-label\">Wallet</span>\n <span className=\"fc-mig-value\"><code>{truncate(w.address)}</code></span>\n </li>\n ))}\n {conflicts.socials.map((s) => (\n <li key={`s-${s.provider}-${s.externalName}`} className=\"fc-mig-item\">\n <span className=\"fc-mig-ic\">{MigrationIcons[s.provider]}</span>\n <span className=\"fc-mig-label\" style={{ textTransform: 'capitalize' }}>{s.provider === 'twitter' ? 'X' : s.provider}</span>\n <span className=\"fc-mig-value\">@{s.externalName}</span>\n </li>\n ))}\n {conflicts.email && (\n <li className=\"fc-mig-item\">\n <span className=\"fc-mig-ic\">{MigrationIcons.email}</span>\n <span className=\"fc-mig-label\">Email</span>\n <span className=\"fc-mig-value\">{conflicts.email.email}</span>\n </li>\n )}\n </ul>\n\n {error && <p className=\"fc-error\">{error}</p>}\n\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-primary\"\n onClick={() => handle(true)}\n disabled={loading !== null}\n >\n {loading === 'migrate' ? 'Moving…' : `Move ${total > 1 ? 'them all' : 'it'}`}\n </button>\n <button\n type=\"button\"\n className=\"fc-mig-skip\"\n onClick={() => handle(false)}\n disabled={loading !== null}\n >\n {loading === 'skip' ? 'Skipping…' : 'Not now'}\n </button>\n </div>\n );\n}\n\n// ── Success View ──\n\nfunction SuccessView() {\n return (\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">You're in</p>\n </div>\n );\n}\n","import { useContext } from 'react';\nimport { ForgeConnectContext, type ForgeConnectContextValue } from '../context';\n\nexport function useForgeConnect(): ForgeConnectContextValue {\n const ctx = useContext(ForgeConnectContext);\n if (!ctx) {\n throw new Error('useForgeConnect must be used within a <ForgeConnectProvider>');\n }\n return ctx;\n}\n","import { useEffect, useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface ModalOverlayProps {\n isOpen: boolean;\n onClose: () => void;\n children: ReactNode;\n}\n\nexport function ModalOverlay({ isOpen, onClose, children }: ModalOverlayProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handleKeyDown);\n document.body.style.overflow = 'hidden';\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n // Only restore scroll if no other fc-overlay remains in the DOM\n if (!document.querySelector('.fc-overlay')) {\n document.body.style.overflow = '';\n }\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === overlayRef.current) onClose();\n };\n\n return createPortal(\n <div className=\"fc-overlay\" ref={overlayRef} onClick={handleBackdropClick}>\n <div className=\"fc-modal\" role=\"dialog\" aria-modal=\"true\">\n <button className=\"fc-modal-close\" onClick={onClose} aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n {children}\n </div>\n </div>,\n document.body,\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport { resolveLoginMethods } from '../../resolve-config.js';\n\nexport function EmailLoginForm() {\n const { loginWithEmail, setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await loginWithEmail(email, password);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Something went wrong. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Sign in with email</h3>\n <form onSubmit={handleSubmit} className=\"fc-form\">\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n <label className=\"fc-label\">\n Password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter your password\"\n required\n autoComplete=\"current-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Signing in...' : 'Sign in'}\n </button>\n </form>\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('forgot-password')}>\n Forgot password?\n </button>\n </p>\n <p className=\"fc-switch\">\n Don't have an account?{' '}\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('email-register')}>\n Sign up\n </button>\n </p>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n\nexport function EmailRegisterForm() {\n const { register, setModalStep } = useForgeConnect();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [displayName, setDisplayName] = useState('');\n const [error, setError] = useState('');\n const [success, setSuccess] = useState(false);\n const [loading, setLoading] = useState(false);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await register(email, password, displayName || undefined);\n setSuccess(true);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Something went wrong. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n if (success) {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Check your email</h3>\n <p className=\"fc-text\">We sent a verification link to <strong>{email}</strong>. Click it to activate your account, then sign in.</p>\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={() => setModalStep('email-login')}>\n Back to sign in\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Create an account</h3>\n <form onSubmit={handleSubmit} className=\"fc-form\">\n <label className=\"fc-label\">\n Display name\n <input\n type=\"text\"\n className=\"fc-input\"\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n placeholder=\"Your name\"\n autoComplete=\"name\"\n />\n </label>\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n <label className=\"fc-label\">\n Password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"8+ characters\"\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Creating account...' : 'Create account'}\n </button>\n </form>\n <p className=\"fc-switch\">\n Already have an account?{' '}\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('email-login')}>\n Sign in\n </button>\n </p>\n </div>\n );\n}\n","import type { ForgeConnectConfig, LoginMethod, ModalStep, OAuthProvider } from './types.js';\n\nconst OAUTH_PROVIDERS: ReadonlySet<string> = new Set(['google', 'discord', 'twitter', 'apple', 'telegram', 'matrica']);\n\n/** Check if a login method is an OAuth provider. */\nexport function isOAuthMethod(method: LoginMethod): method is OAuthProvider {\n return OAUTH_PROVIDERS.has(method);\n}\n\n/**\n * Resolve the effective ordered login methods from config.\n * If `loginMethods` is set, uses that directly.\n * Otherwise, falls back to legacy fields for backward compat.\n */\nexport function resolveLoginMethods(config: ForgeConnectConfig): LoginMethod[] {\n if (config.loginMethods && config.loginMethods.length > 0) {\n return config.loginMethods;\n }\n\n // Legacy resolution\n const methods: LoginMethod[] = [];\n\n if (config.oauthProviders) {\n for (const p of config.oauthProviders) {\n methods.push(p);\n }\n }\n\n methods.push('email');\n\n if (config.passwordlessLogin !== false) {\n methods.push('otp');\n }\n\n if (config.walletLogin !== false) {\n methods.push('wallet');\n }\n\n return methods;\n}\n\n/** Map a LoginMethod to the ModalStep it navigates to. */\nexport function loginMethodToStep(method: LoginMethod): ModalStep {\n switch (method) {\n case 'email': return 'email-login';\n case 'otp': return 'email-otp';\n case 'wallet': return 'wallet-connect';\n case 'passkey': return 'method-select'; // Passkey triggers browser API directly\n default: return 'method-select'; // OAuth methods handled specially\n }\n}\n\n/**\n * Determine the initial modal step when opened.\n * - If only 1 method and it's not OAuth, go directly to that step.\n * - If `defaultLoginMethod` is set (and valid), go to that step.\n * - Otherwise, show method-select.\n */\nexport function resolveInitialStep(config: ForgeConnectConfig, methods: LoginMethod[]): ModalStep {\n // Single method — skip method-select\n if (methods.length === 1 && !isOAuthMethod(methods[0])) {\n return loginMethodToStep(methods[0]);\n }\n\n const defaultMethod = config.defaultLoginMethod;\n if (!defaultMethod || !methods.includes(defaultMethod)) {\n return 'method-select';\n }\n\n if (isOAuthMethod(defaultMethod)) {\n return 'method-select'; // OAuth default handled in openModal by firing popup\n }\n\n return loginMethodToStep(defaultMethod);\n}\n","import { useState, useRef, type FormEvent, type KeyboardEvent, type ClipboardEvent } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport { resolveLoginMethods } from '../../resolve-config.js';\n\nexport function EmailOtpForm() {\n const { sendOtp, verifyOtp, setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const [email, setEmail] = useState('');\n const [code, setCode] = useState(['', '', '', '', '', '']);\n const [step, setStep] = useState<'email' | 'code'>('email');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n const handleSendCode = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await sendOtp(email);\n setStep('code');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not send the code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerify = async (digits: string[]) => {\n const codeStr = digits.join('');\n if (codeStr.length !== 6) return;\n setError('');\n setLoading(true);\n try {\n await verifyOtp(email, codeStr);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'This code is incorrect. Please check and try again.');\n setLoading(false);\n }\n };\n\n const handleDigitChange = (index: number, value: string) => {\n if (!/^\\d*$/.test(value)) return;\n const digit = value.slice(-1);\n const newCode = [...code];\n newCode[index] = digit;\n setCode(newCode);\n\n if (digit && index < 5) {\n inputRefs.current[index + 1]?.focus();\n }\n\n if (newCode.every((d) => d !== '')) {\n handleVerify(newCode);\n }\n };\n\n const handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && !code[index] && index > 0) {\n inputRefs.current[index - 1]?.focus();\n }\n };\n\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, 6);\n if (!pasted) return;\n const newCode = [...code];\n for (let i = 0; i < pasted.length; i++) {\n newCode[i] = pasted[i];\n }\n setCode(newCode);\n if (newCode.every((d) => d !== '')) {\n handleVerify(newCode);\n }\n };\n\n if (step === 'email') {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Passwordless sign in</h3>\n <form onSubmit={handleSendCode} className=\"fc-form\">\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Sending...' : 'Send code'}\n </button>\n </form>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Enter verification code</h3>\n <p className=\"fc-text\">We sent a 6-digit code to <strong>{email}</strong></p>\n <div className=\"fc-otp-inputs\">\n {code.map((digit, i) => (\n <input\n key={i}\n ref={(el) => { inputRefs.current[i] = el; }}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n className=\"fc-otp-digit\"\n value={digit}\n onChange={(e) => handleDigitChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={i === 0 ? handlePaste : undefined}\n autoFocus={i === 0}\n />\n ))}\n </div>\n {error && <p className=\"fc-error\">{error}</p>}\n {loading && <p className=\"fc-text\">Verifying...</p>}\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => { setStep('email'); setCode(['', '', '', '', '', '']); setError(''); }}>\n Use a different email\n </button>\n </p>\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport { resolveLoginMethods } from '../../resolve-config.js';\nimport { PROVIDER_INFO } from './oauth-buttons.js';\nimport { SvgIcon } from '../svg-icon.js';\n\n/** Inline \"Sign in with Matrica\" entry shown in the wallet list (brings wallets in).\n * Uses the OAuth-style icon class so it renders identically to the Matrica button in the main list. */\nfunction MatricaWalletEntry() {\n const { loginWithOAuth } = useForgeConnect();\n const info = PROVIDER_INFO.matrica;\n return (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => loginWithOAuth('matrica')}\n >\n <SvgIcon svg={info.icon} className=\"fc-oauth-icon\" />\n <span className=\"fc-wallet-name\">{info.label}</span>\n <span className=\"fc-badge-preferred\">Brings wallets</span>\n </button>\n );\n}\n\n// ── Mobile wallet deep links ──\n\nexport interface MobileWallet {\n name: string;\n icon: string;\n /** Build a universal link that opens the wallet app with the dApp URL in its in-app browser */\n buildUrl: (pageUrl: string) => string;\n}\n\nexport const MOBILE_WALLETS: MobileWallet[] = [\n {\n name: 'Phantom',\n icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTA4IiBoZWlnaHQ9IjEwOCIgdmlld0JveD0iMCAwIDEwOCAxMDgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMDgiIGhlaWdodD0iMTA4IiByeD0iMjYiIGZpbGw9IiNBQjlGRjIiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00Ni41MjY3IDY5LjkyMjlDNDIuMDA1NCA3Ni44NTA5IDM0LjQyOTIgODUuNjE4MiAyNC4zNDggODUuNjE4MkMxOS41ODI0IDg1LjYxODIgMTUgODMuNjU2MyAxNSA3NS4xMzQyQzE1IDUzLjQzMDUgNDQuNjMyNiAxOS44MzI3IDcyLjEyNjggMTkuODMyN0M4Ny43NjggMTkuODMyNyA5NCAzMC42ODQ2IDk0IDQzLjAwNzlDOTQgNTguODI1OCA4My43MzU1IDc2LjkxMjIgNzMuNTMyMSA3Ni45MTIyQzcwLjI5MzkgNzYuOTEyMiA2OC43MDUzIDc1LjEzNDIgNjguNzA1MyA3Mi4zMTRDNjguNzA1MyA3MS41NzgzIDY4LjgyNzUgNzAuNzgxMiA2OS4wNzE5IDY5LjkyMjlDNjUuNTg5MyA3NS44Njk5IDU4Ljg2ODUgODEuMzg3OCA1Mi41NzU0IDgxLjM4NzhDNDcuOTkzIDgxLjM4NzggNDUuNjcxMyA3OC41MDYzIDQ1LjY3MTMgNzQuNDU5OEM0NS42NzEzIDcyLjk4ODQgNDUuOTc2OCA3MS40NTU2IDQ2LjUyNjcgNjkuOTIyOVpNODMuNjc2MSA0Mi41Nzk0QzgzLjY3NjEgNDYuMTcwNCA4MS41NTc1IDQ3Ljk2NTggNzkuMTg3NSA0Ny45NjU4Qzc2Ljc4MTYgNDcuOTY1OCA3NC42OTg5IDQ2LjE3MDQgNzQuNjk4OSA0Mi41Nzk0Qzc0LjY5ODkgMzguOTg4NSA3Ni43ODE2IDM3LjE5MzEgNzkuMTg3NSAzNy4xOTMxQzgxLjU1NzUgMzcuMTkzMSA4My42NzYxIDM4Ljk4ODUgODMuNjc2MSA0Mi41Nzk0Wk03MC4yMTAzIDQyLjU3OTVDNzAuMjEwMyA0Ni4xNzA0IDY4LjA5MTYgNDcuOTY1OCA2NS43MjE2IDQ3Ljk2NThDNjMuMzE1NyA0Ny45NjU4IDYxLjIzMyA0Ni4xNzA0IDYxLjIzMyA0Mi41Nzk1QzYxLjIzMyAzOC45ODg1IDYzLjMxNTcgMzcuMTkzMSA2NS43MjE2IDM3LjE5MzFDNjguMDkxNiAzNy4xOTMxIDcwLjIxMDMgMzguOTg4NSA3MC4yMTAzIDQyLjU3OTVaIiBmaWxsPSIjRkZGREY4Ii8+Cjwvc3ZnPgo=',\n buildUrl: (url) => `https://phantom.app/ul/browse/${encodeURIComponent(url)}?ref=${encodeURIComponent(url)}`,\n },\n {\n name: 'Solflare',\n icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJTIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MCA1MCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiMwMjA1MGE7c3Ryb2tlOiNmZmVmNDY7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLXdpZHRoOi41cHg7fS5jbHMtMntmaWxsOiNmZmVmNDY7fTwvc3R5bGU+PC9kZWZzPjxyZWN0IGNsYXNzPSJjbHMtMiIgeD0iMCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiByeD0iMTIiIHJ5PSIxMiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTI0LjIzLDI2LjQybDIuNDYtMi4zOCw0LjU5LDEuNWMzLjAxLDEsNC41MSwyLjg0LDQuNTEsNS40MywwLDEuOTYtLjc1LDMuMjYtMi4yNSw0LjkzbC0uNDYuNS4xNy0xLjE3Yy42Ny00LjI2LS41OC02LjA5LTQuNzItNy40M2wtNC4zLTEuMzhoMFpNMTguMDUsMTEuODVsMTIuNTIsNC4xNy0yLjcxLDIuNTktNi41MS0yLjE3Yy0yLjI1LS43NS0zLjAxLTEuOTYtMy4zLTQuNTF2LS4wOGgwWk0xNy4zLDMzLjA2bDIuODQtMi43MSw1LjM0LDEuNzVjMi44LjkyLDMuNzYsMi4xMywzLjQ2LDUuMThsLTExLjY1LTQuMjJoMFpNMTMuNzEsMjAuOTVjMC0uNzkuNDItMS41NCwxLjEzLTIuMTcuNzUsMS4wOSwyLjA1LDIuMDUsNC4wOSwyLjcxbDQuNDIsMS40Ni0yLjQ2LDIuMzgtNC4zNC0xLjQyYy0yLS42Ny0yLjg0LTEuNjctMi44NC0yLjk2TTI2LjgyLDQyLjg3YzkuMTgtNi4wOSwxNC4xMS0xMC4yMywxNC4xMS0xNS4zMiwwLTMuMzgtMi01LjI2LTYuNDMtNi43MmwtMy4zNC0xLjEzLDkuMTQtOC43Ny0xLjg0LTEuOTYtMi43MSwyLjM4LTEyLjgxLTQuMjJjLTMuOTcsMS4yOS04Ljk3LDUuMDktOC45Nyw4Ljg5LDAsLjQyLjA0LjgzLjE3LDEuMjktMy4zLDEuODgtNC42MywzLjYzLTQuNjMsNS44LDAsMi4wNSwxLjA5LDQuMDksNC41NSw1LjIybDIuNzUuOTItOS41Miw5LjE0LDEuODQsMS45NiwyLjk2LTIuNzEsMTQuNzMsNS4yMmgwWiIvPjwvc3ZnPg==',\n buildUrl: (url) => `https://solflare.com/ul/v1/browse/${encodeURIComponent(url)}?ref=${encodeURIComponent(url)}`,\n },\n {\n name: 'Backpack',\n icon: 'data:image/webp;base64,UklGRlgCAABXRUJQVlA4WAoAAAAQAAAAOwAAOwAAQUxQSC8AAAABL6CmbQOGP75e/cti0oiIOI0KBto2+a8ACZjAAQ7wL2gCSCL6PwER2t+KmZpFDwBWUDggAgIAAPALAJ0BKjwAPAA+SSCMRKKiIRYKrTQoBISyAGp7nL12mKuwHiZ/pX71XoA8m7rXfQA8q39lfhJ/cL0ZimIeNSGxOaSWtqEDDdJ++ARG5/LVm6OquItoAu4rpz8VksUr1NEDJ0CeZucwAP7+VdYX7J5e8V3cJZ9QoY9vj8KsNGOvZSm+khDZOvwCeiDFjGweq/8KIUmVQk3T/qW3ONyMcepN2uwyEXpZZiidST0x705r7ZnNuWX42r8oi+FEshvXGWm6DabjfrMbiaxJ15irl2Gj3nKWbZ2v3k/jd172plSBejBs7dNt90Re/m+nmv5kNjM/SPfa4EpzvOdu/8BR+hTnR4qe4eWhTsh/oecEfN31OExdi/6AYrsth4nlx/qGEP70b1/TNKmgaB/18+c9ntTfhku9wYpy17/wN3r+B/1geZPzth+AtNsMDXE99PaPLWdFP9MOIMD6ME+MpZu2H7WSfzY7MkWs/N/NNzAZ0P/9vMvxgcdzFHvs/doeUU9WyVv+Ll8QDJbn9NZl86ZZNYtfP4Ol1hiJHWosWyj/66vhMUeFIcDheXIOSRTzvKwj5ffEl7fn/QwflNU556SEjM8MriwSFJ/nrFBrr8O1/pqdrYGqPijG6tjsBVBHp+EDAbtNLL375I2jnG9i3Xb1ZphsFYNjdRaknYdFf4g5iJBoAAA=',\n buildUrl: (url) => `https://backpack.app/ul/browse/${encodeURIComponent(url)}`,\n },\n];\n\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\nexport function WalletConnectForm() {\n const { walletAdapter, setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n\n // On mobile without wallet adapter, show mobile deep links directly\n if (!walletAdapter && isMobile()) {\n return <MobileWalletFlow />;\n }\n\n if (walletAdapter) {\n return <WalletAdapterFlow />;\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Connect wallet</h3>\n <p className=\"fc-text\">\n No wallet adapter detected. Pass <code>walletAdapter</code> to{' '}\n <code>&lt;ForgeConnectProvider&gt;</code> to enable wallet login.\n </p>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n\n/** Standalone mobile flow — when no wallet adapter is provided but we're on mobile */\nfunction MobileWalletFlow() {\n const { setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const walletConfig = config.walletConfig;\n const preferred = walletConfig?.preferredWallets ?? [];\n const onlyPreferred = walletConfig?.onlyPreferred ?? false;\n\n const walletsToShow = useMemo(() => {\n if (preferred.length > 0) {\n const prefList = preferred\n .map((name) => MOBILE_WALLETS.find((mw) => mw.name === name))\n .filter(Boolean) as MobileWallet[];\n if (onlyPreferred) return prefList;\n const prefNames = new Set(preferred);\n const others = MOBILE_WALLETS.filter((mw) => !prefNames.has(mw.name));\n return [...prefList, ...others];\n }\n return MOBILE_WALLETS;\n }, [preferred, onlyPreferred]);\n\n const handleOpen = (mw: MobileWallet) => {\n const pageUrl = window.location.href;\n window.location.href = mw.buildUrl(pageUrl);\n };\n\n const showMatrica = methods.includes('matrica');\n\n return (\n <div className=\"fc-tab\">\n <div className=\"fc-wallet-list\">\n {showMatrica && <MatricaWalletEntry />}\n {walletsToShow.map((mw) => (\n <button\n key={mw.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleOpen(mw)}\n >\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-preferred\">Open app</span>\n </button>\n ))}\n </div>\n <p className=\"fc-text\" style={{ textAlign: 'center', fontSize: 12, opacity: 0.6 }}>\n You'll be redirected to the wallet app to sign in.\n </p>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n\nfunction WalletAdapterFlow() {\n const { walletAdapter, loginWithWallet, setModalStep, config } = useForgeConnect();\n const wallet = walletAdapter!;\n const walletConfig = config.walletConfig;\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [showOther, setShowOther] = useState(false);\n const [coldWallet, setColdWallet] = useState(false);\n const mobile = useMemo(() => isMobile(), []);\n\n const coldWalletRef = useRef(coldWallet);\n coldWalletRef.current = coldWallet;\n\n // Build a base64→base64 signTransaction wrapper using a specific adapter.\n const buildSignTxFnForAdapter = useCallback((adapter: any): ((txBase64: string) => Promise<string>) | undefined => {\n if (!adapter.signTransaction) return undefined;\n const TxClass = walletConfig?.Transaction;\n if (!TxClass) return undefined;\n return async (txBase64: string) => {\n const bytes = Uint8Array.from(atob(txBase64), (c) => c.charCodeAt(0));\n const tx = TxClass.from(bytes);\n const signedTx = await adapter.signTransaction(tx);\n return btoa(String.fromCharCode(...new Uint8Array(signedTx.serialize())));\n };\n }, [walletConfig?.Transaction]);\n\n // Single handler: connect via React wallet adapter context → then sign\n const handleConnect = async (w: (typeof wallet.wallets)[0]) => {\n if (w.readyState !== 'Installed') {\n if (mobile) {\n const mw = MOBILE_WALLETS.find((m) => m.name === w.adapter.name);\n if (mw) {\n window.location.href = mw.buildUrl(window.location.href);\n return;\n }\n }\n const url = (w.adapter as any).url;\n if (url) window.open(url, '_blank');\n return;\n }\n\n setError('');\n setLoading(true);\n\n try {\n // Step 1: Select in React context (propagates wallet state to the rest of the app)\n wallet.select(w.adapter.name);\n\n // Step 2: Connect via the raw adapter (select is async state — adapter is immediate)\n if (!w.adapter.connected) {\n await (w.adapter as any).connect();\n }\n\n // Step 3: Get publicKey from the adapter (available synchronously after connect)\n const pk = w.adapter.publicKey;\n if (!pk) throw new Error('Wallet did not provide a public key.');\n\n // Step 4: Sign the challenge\n const address: string = pk.toBase58();\n const useCold = coldWalletRef.current;\n const adapterSignMessage = (w.adapter as any).signMessage\n ? (msg: Uint8Array) => (w.adapter as any).signMessage(msg)\n : undefined;\n\n await loginWithWallet(\n address,\n useCold ? undefined : adapterSignMessage,\n 'solana',\n useCold ? buildSignTxFnForAdapter(w.adapter) : undefined,\n );\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not verify your wallet. Please try again.');\n setLoading(false);\n }\n };\n\n const handleMobileOpen = (mw: MobileWallet) => {\n window.location.href = mw.buildUrl(window.location.href);\n };\n\n const preferred = walletConfig?.preferredWallets ?? [];\n const onlyPreferred = walletConfig?.onlyPreferred ?? false;\n const preferredSet = new Set(preferred);\n\n const connectedWalletName = wallet.publicKey\n ? wallet.wallets.find((w) => w.adapter.connected)?.adapter.name ?? null\n : null;\n\n const { preferredWallets, otherWallets } = useMemo(() => {\n const all = wallet.wallets;\n\n const prefList = preferred\n .map((name) => all.find((w) => w.adapter.name === name))\n .filter(Boolean) as typeof all;\n\n if (onlyPreferred && preferred.length > 0) {\n return { preferredWallets: prefList, otherWallets: [] as typeof all };\n }\n\n const others = all.filter(\n (w) => !preferredSet.has(w.adapter.name) && w.readyState === 'Installed',\n );\n\n return { preferredWallets: prefList, otherWallets: others };\n }, [wallet.wallets, walletConfig]);\n\n // On mobile, find wallets from MOBILE_WALLETS that aren't already in the adapter list\n const mobileExtraWallets = useMemo(() => {\n if (!mobile) return [];\n const adapterNames = new Set(wallet.wallets.map((w) => w.adapter.name));\n return MOBILE_WALLETS.filter((mw) => !adapterNames.has(mw.name));\n }, [mobile, wallet.wallets]);\n\n return (\n <div className=\"fc-tab\">\n {loading ? (\n <div style={{ textAlign: 'center', padding: '24px 0' }}>\n <p className=\"fc-tab-title\">Connecting...</p>\n <p className=\"fc-text\">\n {coldWallet\n ? 'Confirm the transaction on your device'\n : 'Approve the connection, then sign the verification request in your wallet'}\n </p>\n {error && (\n <>\n <p className=\"fc-error\">{error}</p>\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={() => { setLoading(false); setError(''); }}\n style={{ marginTop: 8 }}\n >\n Try again\n </button>\n </>\n )}\n </div>\n ) : (\n <>\n <div className=\"fc-wallet-list\">\n {methods.includes('matrica') && <MatricaWalletEntry />}\n {preferredWallets.map((w) => {\n const installed = w.readyState === 'Installed';\n const isConnected = w.adapter.name === connectedWalletName;\n return (\n <button\n key={w.adapter.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleConnect(w)}\n >\n <span className={installed ? 'fc-installed-dot' : ''} style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n {isConnected\n ? <span className=\"fc-badge-preferred\">Last used</span>\n : <span className=\"fc-badge-preferred\">Preferred</span>\n }\n {!installed && mobile && MOBILE_WALLETS.some((mw) => mw.name === w.adapter.name)\n ? <span className=\"fc-badge-install\">Open app</span>\n : !installed && <span className=\"fc-badge-install\">Install</span>\n }\n </button>\n );\n })}\n\n {/* Mobile deep link wallets not already in the adapter list */}\n {mobileExtraWallets.map((mw) => (\n <button\n key={mw.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleMobileOpen(mw)}\n >\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-install\">Open app</span>\n </button>\n ))}\n\n {otherWallets.length > 0 && !showOther && (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => setShowOther(true)}\n >\n <span className=\"fc-other-wallets-icon\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 7h16\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"11\" y=\"10\" width=\"7\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </span>\n <span className=\"fc-wallet-name\">Other wallets</span>\n </button>\n )}\n\n {showOther && otherWallets.map((w) => {\n const isConnected = w.adapter.name === connectedWalletName;\n return (\n <button\n key={w.adapter.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleConnect(w)}\n >\n <span className=\"fc-installed-dot\" style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n {isConnected && <span className=\"fc-badge-preferred\">Last used</span>}\n </button>\n );\n })}\n </div>\n\n {preferredWallets.length === 0 && otherWallets.length === 0 && mobileExtraWallets.length === 0 && (\n <p className=\"fc-text\">No wallet found. Please install a Solana wallet (like Phantom) to continue.</p>\n )}\n\n <label className=\"fc-cold-wallet-toggle\">\n <input\n type=\"checkbox\"\n checked={coldWallet}\n onChange={(e) => setColdWallet(e.target.checked)}\n />\n <span className=\"fc-toggle-track\" />\n <span className=\"fc-cold-wallet-label\">\n <span>Hardware wallet</span>\n <span>Ledger, Trezor, Keystone...</span>\n </span>\n </label>\n\n {error && <p className=\"fc-error\">{error}</p>}\n </>\n )}\n {showBack && !loading && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n","import { useRef, useEffect } from 'react';\n\n/**\n * Safely renders an SVG string by parsing it through the browser's DOMParser\n * and stripping any non-SVG elements (scripts, event handlers, etc.).\n *\n * This replaces dangerouslySetInnerHTML for icon rendering.\n */\nexport function SvgIcon({ svg, className }: { svg: string; className?: string }) {\n const ref = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n if (!ref.current || !svg) return;\n\n try {\n // Parse as HTML so the browser's HTML parser assigns the correct SVG namespace.\n // Using 'image/svg+xml' can leave elements in the null namespace when xmlns is missing.\n const doc = new DOMParser().parseFromString(svg, 'text/html');\n const svgEl = doc.body.querySelector('svg');\n\n if (!svgEl) {\n ref.current.textContent = '';\n return;\n }\n\n // Strip any dangerous elements or attributes\n const dangerous = svgEl.querySelectorAll('script,iframe,object,embed,foreignObject');\n dangerous.forEach((el) => el.remove());\n\n // Remove event handler attributes from all elements\n const all = svgEl.querySelectorAll('*');\n all.forEach((el) => {\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.startsWith('on')) {\n el.removeAttribute(attr.name);\n }\n }\n });\n\n ref.current.textContent = '';\n ref.current.appendChild(svgEl);\n } catch {\n ref.current.textContent = '';\n }\n }, [svg]);\n\n return <span ref={ref} className={className} />;\n}\n","import { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport type { OAuthProvider } from '../../types.js';\nimport { resolveLoginMethods, isOAuthMethod } from '../../resolve-config.js';\nimport { SvgIcon } from '../svg-icon.js';\n\nexport const PROVIDER_INFO: Record<OAuthProvider, { label: string; icon: string }> = {\n google: {\n label: 'Google',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\"/><path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\"/><path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\"/><path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/></svg>',\n },\n discord: {\n label: 'Discord',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128c.126-.094.252-.192.372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03z\" fill=\"#5865F2\"/></svg>',\n },\n twitter: {\n label: 'Twitter',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" fill=\"currentColor\"/></svg>',\n },\n apple: {\n label: 'Apple',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.52-3.23 0-1.44.64-2.2.45-3.06-.4C3.79 16.17 4.36 9.02 8.8 8.78c1.27.06 2.15.72 2.91.76.93-.19 1.82-.88 2.83-.8 1.21.1 2.12.58 2.72 1.49-2.46 1.48-1.88 4.73.52 5.64-.42 1.13-.98 2.24-1.73 3.41zM12.03 8.7c-.12-2.35 1.82-4.38 4.04-4.54.29 2.56-2.34 4.68-4.04 4.54z\" fill=\"currentColor\"/></svg>',\n },\n telegram: {\n label: 'Telegram',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.479.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\" fill=\"#2AABEE\"/></svg>',\n },\n matrica: {\n label: 'Matrica',\n icon: '<svg viewBox=\"2 1 26 26\" width=\"20\" height=\"20\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"11.457\" y=\"10.6387\" width=\"7.00961\" height=\"7.00962\" fill=\"#4A99BF\"/><path d=\"M12.6266 1.87695V5.08969H5.90903V23.1979H12.6266V26.4106H2.69629V1.87695H12.6266Z\" fill=\"#4A99BF\"/><path d=\"M17.2997 26.4106H27.2299V1.87695H17.2997V5.08969H24.0172V23.1979H17.2997V26.4106Z\" fill=\"#4A99BF\"/></svg>',\n },\n};\n\n/** Single OAuth provider button (card-style). */\nexport function OAuthButton({ provider }: { provider: OAuthProvider }) {\n const { loginWithOAuth } = useForgeConnect();\n const info = PROVIDER_INFO[provider];\n\n return (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-oauth\"\n onClick={() => loginWithOAuth(provider)}\n >\n <SvgIcon svg={info.icon} className=\"fc-oauth-icon\" />\n <span className=\"fc-btn-name\">{info.label}</span>\n </button>\n );\n}\n\n/** Renders all OAuth providers from the resolved config. Legacy convenience wrapper. */\nexport function OAuthButtons() {\n const { config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const oauthMethods = methods.filter(isOAuthMethod);\n\n if (oauthMethods.length === 0) return null;\n\n return (\n <div className=\"fc-oauth-buttons\">\n {oauthMethods.map((provider) => (\n <OAuthButton key={provider} provider={provider} />\n ))}\n </div>\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\n\ntype Step = 'email' | 'reset' | 'done';\n\nexport function ForgotPasswordForm() {\n const { forgotPassword, resetPassword, setModalStep } = useForgeConnect();\n const [step, setStep] = useState<Step>('email');\n const [email, setEmail] = useState('');\n const [token, setToken] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const handleSendCode = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await forgotPassword(email);\n setStep('reset');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not send the reset code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleReset = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await resetPassword(token.trim(), password);\n setStep('done');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not reset your password. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n if (step === 'done') {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Password updated</h3>\n <p className=\"fc-text\">Your password has been reset. You can now sign in.</p>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={() => setModalStep('email-login')}>\n Sign in\n </button>\n </div>\n );\n }\n\n if (step === 'reset') {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Set new password</h3>\n <p className=\"fc-text\">We sent a reset code to <strong>{email}</strong>. Paste it below with your new password.</p>\n <form onSubmit={handleReset} className=\"fc-form\">\n <label className=\"fc-label\">\n Reset code\n <input\n type=\"text\"\n className=\"fc-input\"\n value={token}\n onChange={(e) => setToken(e.target.value)}\n placeholder=\"Paste the code from your email\"\n required\n autoComplete=\"off\"\n />\n </label>\n <label className=\"fc-label\">\n New password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"8+ characters\"\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Resetting...' : 'Reset password'}\n </button>\n </form>\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setStep('email')}>\n Resend code\n </button>\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Reset your password</h3>\n <p className=\"fc-text\">Enter your email and we'll send you a reset code.</p>\n <form onSubmit={handleSendCode} className=\"fc-form\">\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Sending...' : 'Send reset code'}\n </button>\n </form>\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('email-login')}>\n Back to sign in\n </button>\n </p>\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\n\nexport function Verify2FAForm() {\n const { verify2FA, verifyRecoveryCode, setModalStep } = useForgeConnect();\n const [code, setCode] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [useRecovery, setUseRecovery] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const submittingRef = useRef(false);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, [useRecovery]);\n\n const submitCode = useCallback(async (codeValue: string, isRecovery: boolean) => {\n if (submittingRef.current || !codeValue.trim()) return;\n submittingRef.current = true;\n setLoading(true);\n setError('');\n try {\n if (isRecovery) {\n await verifyRecoveryCode(codeValue.trim());\n } else {\n await verify2FA(codeValue.trim());\n }\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Verification failed. Please try again.');\n } finally {\n setLoading(false);\n submittingRef.current = false;\n }\n }, [verify2FA, verifyRecoveryCode]);\n\n const handleSubmit = async (e?: React.FormEvent) => {\n e?.preventDefault();\n await submitCode(code, useRecovery);\n };\n\n const handleCodeChange = (value: string) => {\n setCode(value);\n // Auto-submit when 6 digits entered (TOTP mode only)\n if (!useRecovery && value.length === 6 && /^\\d{6}$/.test(value)) {\n submitCode(value, false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n <button type=\"button\" className=\"fc-back\" onClick={() => setModalStep('method-select')}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M10 12L6 8l4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n Back\n </button>\n\n <p className=\"fc-account-section-desc\" style={{ marginTop: 8 }}>\n {useRecovery\n ? 'Enter one of your recovery codes.'\n : 'Enter the 6-digit code from your authenticator app.'\n }\n </p>\n\n {error && <p className=\"fc-error\">{error}</p>}\n\n <form onSubmit={handleSubmit} className=\"fc-form\">\n <input\n ref={inputRef}\n className=\"fc-input fc-input-code\"\n type=\"text\"\n inputMode={useRecovery ? 'text' : 'numeric'}\n autoComplete=\"one-time-code\"\n placeholder={useRecovery ? 'Recovery code' : '000000'}\n maxLength={useRecovery ? 20 : 6}\n value={code}\n onChange={(e) => handleCodeChange(e.target.value)}\n style={useRecovery ? {} : { textAlign: 'center', letterSpacing: '0.3em', fontSize: '1.25rem' }}\n />\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading || !code.trim()}>\n {loading ? 'Verifying...' : 'Verify'}\n </button>\n </form>\n\n <button\n type=\"button\"\n className=\"fc-link\"\n onClick={() => { setUseRecovery(!useRecovery); setCode(''); setError(''); }}\n style={{ marginTop: 12 }}\n >\n {useRecovery ? 'Use authenticator code instead' : 'Use a recovery code'}\n </button>\n </div>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { useUser } from '../hooks/use-user.js';\nimport { useWallets } from '../hooks/use-wallets.js';\nimport { useSessions } from '../hooks/use-sessions.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { TwoFactorModal } from './two-factor-modal.js';\nimport { PasskeysModal } from './passkeys-modal.js';\nimport { PasswordModal } from './password-modal.js';\nimport { DeleteAccountModal } from './delete-account-modal.js';\nimport { PROVIDER_INFO } from './tabs/oauth-buttons.js';\nimport { SvgIcon } from './svg-icon.js';\nimport { timeAgo } from '../lib/utils.js';\nimport type { AccountModalTab, OAuthProvider } from '../types.js';\n\n// ── Friendly provider display ──\n\nconst METHOD_DISPLAY: Record<string, { label: string; iconHtml?: string }> = {\n email: {\n label: 'Email',\n iconHtml: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>',\n },\n solana_wallet: {\n label: 'Solana Wallet',\n iconHtml: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n },\n ethereum_wallet: {\n label: 'Ethereum Wallet',\n iconHtml: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n },\n};\n\nfunction getMethodDisplay(provider: string) {\n // Check OAuth providers first\n if (provider in PROVIDER_INFO) {\n const info = PROVIDER_INFO[provider as OAuthProvider];\n return { label: info.label, iconHtml: info.icon };\n }\n return METHOD_DISPLAY[provider] ?? { label: provider, iconHtml: undefined };\n}\n\nfunction truncate(str: string, max = 12) {\n if (str.length <= max) return str;\n return `${str.slice(0, 6)}...${str.slice(-4)}`;\n}\n\nconst ChevronRight = () => (\n <span className=\"fc-security-card-chevron\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n);\n\n// ── Tab config ──\n\nconst TABS: { key: AccountModalTab; label: string }[] = [\n { key: 'profile', label: 'Profile' },\n { key: 'auth-methods', label: 'Logins' },\n { key: 'wallets', label: 'Wallets' },\n { key: 'sessions', label: 'Security' },\n];\n\n// ── Main ──\n\nexport function AccountModal() {\n const { accountModal, closeAccountModal, openLinkModal, linkModal, config, logout } = useForgeConnect();\n const { user } = useUser();\n const [activeTab, setActiveTab] = useState<AccountModalTab>('profile');\n\n // Track when LinkAuthModal closes → bump key so tabs re-fetch\n const [refreshKey, setRefreshKey] = useState(0);\n const prevLinkOpen = useRef(false);\n useEffect(() => {\n if (prevLinkOpen.current && !linkModal.isOpen) {\n setRefreshKey((k) => k + 1);\n }\n prevLinkOpen.current = linkModal.isOpen;\n }, [linkModal.isOpen]);\n\n if (!accountModal.isOpen) return null;\n\n const theme = config.appearance?.theme ?? 'light';\n const initial = (user?.displayName ?? user?.primaryEmail ?? '?').charAt(0).toUpperCase();\n\n return (\n <ModalOverlay isOpen={accountModal.isOpen} onClose={closeAccountModal}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {/* ── Hero ── */}\n <div className=\"fc-account-hero\">\n {user?.avatarUrl ? (\n <img src={user.avatarUrl} alt=\"\" className=\"fc-account-hero-avatar\" />\n ) : (\n <span className=\"fc-account-hero-avatar fc-account-hero-avatar-placeholder\">{initial}</span>\n )}\n <div className=\"fc-account-hero-info\">\n <span className=\"fc-account-hero-name\">{user?.displayName ?? 'Your account'}</span>\n {user?.primaryEmail && <span className=\"fc-account-hero-email\">{user.primaryEmail}</span>}\n </div>\n </div>\n\n {/* ── Tabs ── */}\n <div className=\"fc-account-tabs\">\n {TABS.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n className={`fc-account-tab${activeTab === tab.key ? ' fc-account-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.key)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* ── Content ── */}\n {activeTab === 'profile' && <ProfileTab />}\n {activeTab === 'auth-methods' && <LoginsTab onLink={() => openLinkModal('auth')} refreshKey={refreshKey} />}\n {activeTab === 'wallets' && <WalletsTab onLink={() => openLinkModal('wallet')} refreshKey={refreshKey} />}\n {activeTab === 'sessions' && <SecurityTab />}\n\n {/* ── Footer ── */}\n <div className=\"fc-account-footer\">\n <button\n type=\"button\"\n className=\"fc-btn-logout\"\n onClick={() => { logout(); closeAccountModal(); }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M7 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3M13 14l4-4-4-4M17 10H7\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n Log out\n </button>\n </div>\n </div>\n </ModalOverlay>\n );\n}\n\n// ── Profile Tab ──\n\nfunction ProfileTab() {\n const { user, updateProfile } = useUser();\n const [displayName, setDisplayName] = useState(user?.displayName ?? '');\n const [avatarUrl, setAvatarUrl] = useState(user?.avatarUrl ?? '');\n const [loading, setLoading] = useState(false);\n const [msg, setMsg] = useState<{ text: string; ok: boolean } | null>(null);\n\n useEffect(() => {\n setDisplayName(user?.displayName ?? '');\n setAvatarUrl(user?.avatarUrl ?? '');\n }, [user]);\n\n const handleSave = async () => {\n setLoading(true);\n setMsg(null);\n try {\n await updateProfile({\n displayName: displayName || undefined,\n avatarUrl: avatarUrl || undefined,\n });\n setMsg({ text: 'Profile updated', ok: true });\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Something went wrong. Please try again.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n <div className=\"fc-form\">\n <label className=\"fc-label\">\n Name\n <input\n className=\"fc-input\"\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n placeholder=\"How should we call you?\"\n />\n </label>\n <label className=\"fc-label\">\n Photo URL\n <input\n className=\"fc-input\"\n value={avatarUrl}\n onChange={(e) => setAvatarUrl(e.target.value)}\n placeholder=\"Paste a link to your photo\"\n />\n </label>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={handleSave} disabled={loading}>\n {loading ? 'Saving...' : 'Save changes'}\n </button>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n </div>\n </div>\n );\n}\n\n// ── Logins Tab ──\n\nfunction LoginsTab({ onLink, refreshKey }: { onLink: () => void; refreshKey: number }) {\n const { authMethods, loading, fetchAuthMethods, unlinkAuthMethod } = useUser();\n const [msg, setMsg] = useState('');\n\n useEffect(() => {\n fetchAuthMethods().catch(() => {});\n }, [fetchAuthMethods, refreshKey]);\n\n const handleRemove = async (id: string) => {\n setMsg('');\n try {\n await unlinkAuthMethod(id);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not remove this sign-in method. Please try again.');\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {msg && <p className=\"fc-error\">{msg}</p>}\n {loading && <p className=\"fc-text\">Loading...</p>}\n <p className=\"fc-account-section-desc\">Ways you can sign in to your account.</p>\n {authMethods?.map((m) => {\n const display = getMethodDisplay(m.provider);\n const detail = m.provider === 'email'\n ? m.providerId\n : m.provider.endsWith('_wallet')\n ? truncate(m.providerId)\n : m.providerUsername\n ? (m.provider === 'twitter' || m.provider === 'telegram' ? `@${m.providerUsername}` : m.providerUsername)\n : truncate(m.providerId);\n return (\n <div key={m.id} className=\"fc-account-item\">\n {display.iconHtml && (\n <SvgIcon svg={display.iconHtml} className=\"fc-account-item-icon\" />\n )}\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">{display.label}</span>\n <span className=\"fc-account-item-detail\">{detail}</span>\n </div>\n <div className=\"fc-account-item-actions\">\n {m.isVerified && <span className=\"fc-badge-verified\">Verified</span>}\n <button type=\"button\" className=\"fc-btn-danger-sm\" onClick={() => handleRemove(m.id)}>\n Remove\n </button>\n </div>\n </div>\n );\n })}\n {authMethods?.length === 0 && <p className=\"fc-account-empty\">No login methods yet</p>}\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={onLink} style={{ marginTop: 8 }}>\n + Add login method\n </button>\n </div>\n );\n}\n\n// ── Wallets Tab ──\n\nfunction WalletsTab({ onLink, refreshKey }: { onLink: () => void; refreshKey: number }) {\n const { wallets, loading, fetchWallets, updateWallet } = useWallets();\n const [msg, setMsg] = useState('');\n\n useEffect(() => {\n fetchWallets().catch(() => {});\n }, [fetchWallets, refreshKey]);\n\n const handleSetPrimary = async (id: string) => {\n setMsg('');\n try {\n await updateWallet(id, { isPrimary: true });\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not update this wallet. Please try again.');\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {msg && <p className=\"fc-error\">{msg}</p>}\n {loading && <p className=\"fc-text\">Loading...</p>}\n <p className=\"fc-account-section-desc\">Crypto wallets connected to your account.</p>\n {wallets?.map((w) => (\n <div key={w.id} className=\"fc-account-item\">\n <SvgIcon svg={METHOD_DISPLAY[`${w.chain}_wallet`]?.iconHtml ?? ''} className=\"fc-account-item-icon\" />\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">\n {w.chain.charAt(0).toUpperCase() + w.chain.slice(1)}\n {w.isPrimary && <span className=\"fc-badge-primary\" style={{ marginLeft: 6 }}>Primary</span>}\n </span>\n <span className=\"fc-account-item-detail\">{truncate(w.address)}</span>\n </div>\n <div className=\"fc-account-item-actions\">\n {!w.isPrimary && (\n <button type=\"button\" className=\"fc-btn-primary-sm\" onClick={() => handleSetPrimary(w.id)}>\n Make primary\n </button>\n )}\n </div>\n </div>\n ))}\n {wallets?.length === 0 && <p className=\"fc-account-empty\">No wallets connected</p>}\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={onLink} style={{ marginTop: 8 }}>\n + Connect wallet\n </button>\n </div>\n );\n}\n\n// ── Security Tab ──\n\nfunction SecurityTab() {\n const { sessions, loading, fetchSessions, revokeSession } = useSessions();\n const { logoutAll, logout, closeAccountModal, api, getAccessToken } = useForgeConnect();\n const { user, authMethods: userAuthMethods, fetchAuthMethods } = useUser();\n const [msg, setMsg] = useState('');\n\n // Card status\n const [totpEnabled, setTotpEnabled] = useState<boolean | null>(null);\n const [passkeyCount, setPasskeyCount] = useState(0);\n\n // Sub-modal visibility\n const [show2FAModal, setShow2FAModal] = useState(false);\n const [showPasskeyModal, setShowPasskeyModal] = useState(false);\n const [showPasswordModal, setShowPasswordModal] = useState(false);\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n\n const refreshStatus = useCallback(() => {\n const token = getAccessToken();\n if (!token) return;\n api.get2FAStatus(token).then((r) => setTotpEnabled(r.enabled)).catch(() => {});\n }, [api, getAccessToken]);\n\n const refreshPasskeyCount = useCallback(() => {\n const token = getAccessToken();\n if (!token) return;\n api.getPasskeys(token).then((list) => setPasskeyCount(list.length)).catch(() => {});\n }, [api, getAccessToken]);\n\n useEffect(() => {\n fetchSessions().catch(() => {});\n fetchAuthMethods().catch(() => {});\n refreshStatus();\n refreshPasskeyCount();\n }, [fetchSessions, fetchAuthMethods, refreshStatus, refreshPasskeyCount]);\n\n const hasPassword = userAuthMethods?.some((m) => m.provider === 'email');\n\n const handleRevoke = async (id: string) => {\n setMsg('');\n try {\n await revokeSession(id);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not sign out this session. Please try again.');\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {msg && <p className=\"fc-error\">{msg}</p>}\n\n {/* ── 2FA Card ── */}\n <button type=\"button\" className=\"fc-security-card\" onClick={() => setShow2FAModal(true)}>\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 2l6 3v4c0 4.42-2.56 8.22-6 9.5C6.56 17.22 4 13.42 4 9V5l6-3z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M7.5 10.5l2 2 3.5-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Two-factor authentication</span>\n <span className=\"fc-security-card-detail\">\n {totpEnabled === null ? 'Loading...' : totpEnabled ? 'Enabled' : 'Not enabled'}\n </span>\n </span>\n <ChevronRight />\n </button>\n\n {/* ── Passkeys Card ── */}\n <button type=\"button\" className=\"fc-security-card\" onClick={() => setShowPasskeyModal(true)}>\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"8\" cy=\"7\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M13 13.5a5 5 0 0 0-10 0\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M15 10v4m0 0l-1.5-1m1.5 1l1.5-1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Passkeys</span>\n <span className=\"fc-security-card-detail\">\n {passkeyCount === 0 ? 'No passkeys' : `${passkeyCount} passkey${passkeyCount !== 1 ? 's' : ''}`}\n </span>\n </span>\n <ChevronRight />\n </button>\n\n {/* ── Password Card ── */}\n {user?.primaryEmail && (\n <button\n type=\"button\"\n className=\"fc-security-card\"\n onClick={() => setShowPasswordModal(true)}\n >\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"3\" y=\"9\" width=\"14\" height=\"8\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M6 9V6a4 4 0 1 1 8 0v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Password</span>\n <span className=\"fc-security-card-detail\">\n {hasPassword ? 'Change your password' : 'Set a password'}\n </span>\n </span>\n <ChevronRight />\n </button>\n )}\n\n {/* ── Sessions ── */}\n <div className=\"fc-divider\" style={{ margin: '16px 0' }}><span>active sessions</span></div>\n {loading && <p className=\"fc-text\">Loading...</p>}\n {sessions?.map((s) => (\n <div key={s.id} className=\"fc-account-item\">\n <span className=\"fc-account-item-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M7 17h6M10 14v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n </span>\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">\n {s.ipAddress === '127.0.0.1' || s.ipAddress === '::1'\n ? 'This device'\n : truncate(s.ipAddress, 20)}\n </span>\n <span className=\"fc-account-item-detail\">\n Active {timeAgo(s.lastActiveAt)} · Expires {new Date(s.expiresAt).toLocaleDateString()}\n </span>\n </div>\n <div className=\"fc-account-item-actions\">\n <button type=\"button\" className=\"fc-btn-danger-sm\" onClick={() => handleRevoke(s.id)}>\n Sign out\n </button>\n </div>\n </div>\n ))}\n {sessions?.length === 0 && <p className=\"fc-account-empty\">No active sessions</p>}\n {sessions && sessions.length > 1 && (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={() => { logoutAll(); }}\n style={{ marginTop: 8 }}\n >\n Sign out of all devices\n </button>\n )}\n\n {/* ── Danger zone ── */}\n <div className=\"fc-divider\" style={{ margin: '16px 0' }}><span>danger zone</span></div>\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={() => setShowDeleteModal(true)}\n style={{ background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n Delete account\n </button>\n\n {/* ── Sub-modals ── */}\n <TwoFactorModal\n isOpen={show2FAModal}\n onClose={() => { setShow2FAModal(false); refreshStatus(); }}\n initialEnabled={totpEnabled ?? false}\n onStatusChange={(e) => setTotpEnabled(e)}\n />\n <PasskeysModal\n isOpen={showPasskeyModal}\n onClose={() => { setShowPasskeyModal(false); refreshPasskeyCount(); }}\n onCountChange={(count) => setPasskeyCount(count)}\n />\n {user?.primaryEmail && (\n <PasswordModal\n isOpen={showPasswordModal}\n onClose={() => { setShowPasswordModal(false); fetchAuthMethods().catch(() => {}); }}\n hasPassword={hasPassword ?? false}\n />\n )}\n <DeleteAccountModal\n isOpen={showDeleteModal}\n onClose={() => setShowDeleteModal(false)}\n onDeleted={() => { logout(); closeAccountModal(); }}\n />\n </div>\n );\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { AuthMethod } from '../types';\n\nexport function useUser() {\n const { auth, api, config, getAccessToken } = useForgeConnect();\n const [authMethods, setAuthMethods] = useState<AuthMethod[] | null>(null);\n const [loading, setLoading] = useState(false);\n const pendingRefreshRef = useRef(false);\n\n const updateProfile = useCallback(\n async (data: { displayName?: string; avatarUrl?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n return api.updateMe(token, data);\n },\n [api, getAccessToken],\n );\n\n const fetchAuthMethods = useCallback(async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const methods = await api.getAuthMethods(token);\n setAuthMethods(methods as AuthMethod[]);\n return methods;\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken]);\n\n const linkAuthMethod = useCallback(\n async (data: { provider: string; email?: string; password?: string; challengeId?: string; signature?: string; walletAddress?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.linkAuthMethod(token, data);\n await fetchAuthMethods();\n },\n [api, getAccessToken, fetchAuthMethods],\n );\n\n const linkOtpSend = useCallback(\n async (email: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.linkOtpSend(token, email);\n },\n [api, getAccessToken],\n );\n\n const linkOtpVerify = useCallback(\n async (email: string, code: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.linkOtpVerify(token, email, code);\n await fetchAuthMethods();\n },\n [api, getAccessToken, fetchAuthMethods],\n );\n\n const unlinkAuthMethod = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.unlinkAuthMethod(token, id);\n await fetchAuthMethods();\n },\n [api, getAccessToken, fetchAuthMethods],\n );\n\n // ── OAuth linking via popup ──\n\n const linkOAuth = useCallback(\n async (provider: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n\n // Create a short-lived link intent token (avoids exposing JWT in URL)\n const { intentToken } = await api.createLinkIntent(token);\n\n const redirectUri = encodeURIComponent(window.location.origin + '/fc-oauth-callback');\n const url = `${config.apiUrl}/auth/oauth/${provider}/link?intent=${encodeURIComponent(intentToken)}&redirect_uri=${redirectUri}`;\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.innerWidth - width) / 2;\n const top = window.screenY + (window.innerHeight - height) / 2;\n window.open(url, 'fc_oauth_link', `width=${width},height=${height},left=${left},top=${top}`);\n pendingRefreshRef.current = true;\n },\n [api, config.apiUrl, getAccessToken],\n );\n\n // Listen for OAuth link callback\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) return;\n if (event.data?.type === 'fc_oauth_link_success' && pendingRefreshRef.current) {\n pendingRefreshRef.current = false;\n fetchAuthMethods().catch(() => {});\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [fetchAuthMethods]);\n\n return {\n user: auth.user,\n authMethods,\n loading,\n updateProfile,\n fetchAuthMethods,\n linkAuthMethod,\n linkOtpSend,\n linkOtpVerify,\n unlinkAuthMethod,\n linkOAuth,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport { uint8ArrayToBase58 } from '../lib/utils.js';\nimport type { Wallet } from '../types';\n\nexport function useWallets() {\n const { api, getAccessToken } = useForgeConnect();\n const [wallets, setWallets] = useState<Wallet[] | null>(null);\n const [loading, setLoading] = useState(false);\n\n const fetchWallets = useCallback(async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.getWallets(token);\n setWallets(data as Wallet[]);\n return data;\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken]);\n\n const updateWallet = useCallback(\n async (id: string, data: { label?: string; isPrimary?: boolean }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.updateWallet(token, id, data);\n await fetchWallets();\n },\n [api, getAccessToken, fetchWallets],\n );\n\n const linkWallet = useCallback(\n async (\n walletAddress: string,\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined,\n chain: string = 'solana',\n signTransaction?: (txBase64: string) => Promise<string>,\n ) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n\n if (signMessage) {\n // Standard message-signing flow (hot wallets)\n const { challengeId, message: challengeMessage } = await api.walletChallenge(walletAddress, chain);\n const encoded = new TextEncoder().encode(challengeMessage);\n const signatureBytes = await signMessage(encoded);\n const signature = chain === 'solana'\n ? uint8ArrayToBase58(signatureBytes)\n : Array.from(signatureBytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n await api.linkAuthMethod(token, {\n provider: `${chain}_wallet`,\n challengeId,\n signature,\n walletAddress,\n });\n } else {\n // Transaction-based flow (hardware/cold wallets)\n if (!signTransaction) {\n throw new Error('Wallet does not support message signing or transaction signing.');\n }\n const { challengeId, transaction: txBase64 } = await api.walletChallengeTx(walletAddress, chain);\n const signedTxBase64 = await signTransaction(txBase64);\n await api.linkAuthMethod(token, {\n provider: `${chain}_wallet_tx`,\n challengeId,\n signedTransaction: signedTxBase64,\n walletAddress,\n });\n }\n\n await fetchWallets();\n },\n [api, getAccessToken, fetchWallets],\n );\n\n return {\n wallets,\n loading,\n fetchWallets,\n updateWallet,\n linkWallet,\n };\n}\n\n","const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\nexport function uint8ArrayToBase58(bytes: Uint8Array): string {\n const digits = [0];\n for (const byte of bytes) {\n let carry = byte;\n for (let j = 0; j < digits.length; j++) {\n carry += digits[j] << 8;\n digits[j] = carry % 58;\n carry = (carry / 58) | 0;\n }\n while (carry > 0) {\n digits.push(carry % 58);\n carry = (carry / 58) | 0;\n }\n }\n let str = '';\n for (let i = 0; i < bytes.length && bytes[i] === 0; i++) {\n str += '1';\n }\n for (let i = digits.length - 1; i >= 0; i--) {\n str += BASE58_ALPHABET[digits[i]];\n }\n return str;\n}\n\nexport function timeAgo(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diff = now - then;\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n return new Date(dateStr).toLocaleDateString();\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { Session } from '../types';\n\nexport function useSessions() {\n const { api, getAccessToken } = useForgeConnect();\n const [sessions, setSessions] = useState<Session[] | null>(null);\n const [loading, setLoading] = useState(false);\n\n const fetchSessions = useCallback(async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.getSessions(token);\n setSessions(data as Session[]);\n return data;\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken]);\n\n const revokeSession = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.revokeSession(token, id);\n await fetchSessions();\n },\n [api, getAccessToken, fetchSessions],\n );\n\n return {\n sessions,\n loading,\n fetchSessions,\n revokeSession,\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\n\ninterface TwoFactorModalProps {\n isOpen: boolean;\n onClose: () => void;\n initialEnabled: boolean;\n onStatusChange: (enabled: boolean) => void;\n}\n\ntype Step = 'setup' | 'manage' | 'confirm-regenerate' | 'confirm-disable' | 'recovery-codes';\n\nexport function TwoFactorModal({ isOpen, onClose, initialEnabled, onStatusChange }: TwoFactorModalProps) {\n const { api, getAccessToken, config } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [step, setStep] = useState<Step>(initialEnabled ? 'manage' : 'setup');\n\n // Setup state\n const [setupData, setSetupData] = useState<{ secret: string; qrCodeDataUrl: string; recoveryCodes: string[] } | null>(null);\n const [code, setCode] = useState('');\n const [loading, setLoading] = useState(false);\n const [msg, setMsg] = useState<{ text: string; ok: boolean } | null>(null);\n const [showSecret, setShowSecret] = useState(false);\n\n // Recovery codes (shared between setup and regenerate)\n const [recoveryCodes, setRecoveryCodes] = useState<string[]>([]);\n\n useEffect(() => {\n if (isOpen) {\n setStep(initialEnabled ? 'manage' : 'setup');\n setSetupData(null);\n setCode('');\n setMsg(null);\n setLoading(false);\n setShowSecret(false);\n setRecoveryCodes([]);\n\n // Auto-trigger setup if not enabled\n if (!initialEnabled) {\n const token = getAccessToken();\n if (token) {\n setLoading(true);\n api.setup2FA(token)\n .then((data) => {\n setSetupData(data);\n setRecoveryCodes(data.recoveryCodes);\n })\n .catch((err: unknown) => {\n setMsg({ text: err instanceof Error ? err.message : 'Could not set up 2FA.', ok: false });\n })\n .finally(() => setLoading(false));\n }\n }\n }\n }, [isOpen, initialEnabled, api, getAccessToken]);\n\n const handleEnable = async () => {\n const token = getAccessToken();\n if (!token || !code) return;\n setLoading(true);\n setMsg(null);\n try {\n await api.enable2FA(token, code);\n onStatusChange(true);\n setStep('recovery-codes');\n setCode('');\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Invalid code.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n const handleDisable = async () => {\n const token = getAccessToken();\n if (!token || !code) return;\n setLoading(true);\n setMsg(null);\n try {\n await api.disable2FA(token, code);\n onStatusChange(false);\n setCode('');\n onClose();\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Invalid code.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n const handleRegenerate = async () => {\n const token = getAccessToken();\n if (!token || !code) return;\n setLoading(true);\n setMsg(null);\n try {\n const { recoveryCodes: codes } = await api.regenerateRecoveryCodes(token, code);\n setRecoveryCodes(codes);\n setStep('recovery-codes');\n setCode('');\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Invalid code.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n const handleCopyAll = () => {\n navigator.clipboard.writeText(recoveryCodes.join('\\n')).catch(() => {});\n };\n\n const goBack = () => {\n setCode('');\n setMsg(null);\n setStep('manage');\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {/* ── Setup flow (not enabled) ── */}\n {step === 'setup' && (\n <>\n <h2 className=\"fc-modal-title\">Set up 2FA</h2>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n {loading && !setupData && <p className=\"fc-text\">Loading...</p>}\n {setupData && (\n <div className=\"fc-tab\">\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Scan this QR code with your authenticator app\n </p>\n <div style={{ display: 'flex', justifyContent: 'center', margin: '12px 0' }}>\n <img\n src={setupData.qrCodeDataUrl}\n alt=\"TOTP QR code\"\n style={{ width: 180, height: 180, borderRadius: 12 }}\n />\n </div>\n <div style={{ textAlign: 'center', marginBottom: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={() => setShowSecret(!showSecret)}>\n {showSecret ? 'Hide code' : \"Can't scan? Enter manually\"}\n </button>\n {showSecret && (\n <p style={{ margin: '8px 0 0', fontFamily: 'monospace', fontSize: 12, opacity: 0.7, wordBreak: 'break-all' }}>\n {setupData.secret}\n </p>\n )}\n </div>\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-primary\"\n onClick={handleEnable}\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10 }}\n >\n {loading ? 'Verifying...' : 'Verify & Enable'}\n </button>\n </div>\n )}\n </>\n )}\n\n {/* ── Manage (enabled) — just two action buttons ── */}\n {step === 'manage' && (\n <>\n <h2 className=\"fc-modal-title\">Two-factor authentication</h2>\n <div style={{ textAlign: 'center', marginBottom: 20 }}>\n <span className=\"fc-badge-verified\" style={{ fontSize: 12, padding: '4px 12px' }}>Enabled</span>\n </div>\n <div className=\"fc-tab\">\n <button\n type=\"button\"\n className=\"fc-security-card\"\n onClick={() => { setCode(''); setMsg(null); setStep('confirm-regenerate'); }}\n >\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M3 10a7 7 0 0 1 7-7m0 14a7 7 0 0 1-7-7m14 0a7 7 0 0 1-7 7m0-14a7 7 0 0 1 7 7\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M14 3l-1 3h3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Regenerate recovery codes</span>\n <span className=\"fc-security-card-detail\">Get new backup codes</span>\n </span>\n <span className=\"fc-security-card-chevron\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </button>\n\n <button\n type=\"button\"\n className=\"fc-security-card\"\n onClick={() => { setCode(''); setMsg(null); setStep('confirm-disable'); }}\n >\n <span className=\"fc-security-card-icon\" style={{ color: '#dc2626' }}>\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 2l6 3v4c0 4.42-2.56 8.22-6 9.5C6.56 17.22 4 13.42 4 9V5l6-3z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M7.5 7.5l5 5M12.5 7.5l-5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\" style={{ color: '#dc2626' }}>Disable 2FA</span>\n <span className=\"fc-security-card-detail\">Remove two-factor authentication</span>\n </span>\n <span className=\"fc-security-card-chevron\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </button>\n </div>\n </>\n )}\n\n {/* ── Confirm: Regenerate recovery codes ── */}\n {step === 'confirm-regenerate' && (\n <>\n <h2 className=\"fc-modal-title\">Regenerate recovery codes</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Enter your 2FA code to generate new recovery codes. Your old codes will stop working.\n </p>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n <div className=\"fc-tab\">\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-primary\"\n onClick={handleRegenerate}\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10 }}\n >\n {loading ? 'Generating...' : 'Regenerate codes'}\n </button>\n <div className=\"fc-switch\" style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={goBack}>Back</button>\n </div>\n </div>\n </>\n )}\n\n {/* ── Confirm: Disable 2FA ── */}\n {step === 'confirm-disable' && (\n <>\n <h2 className=\"fc-modal-title\">Disable 2FA</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Enter your 2FA code to disable two-factor authentication.\n </p>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n <div className=\"fc-tab\">\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={handleDisable}\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10, background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n {loading ? 'Disabling...' : 'Disable 2FA'}\n </button>\n <div className=\"fc-switch\" style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={goBack}>Back</button>\n </div>\n </div>\n </>\n )}\n\n {/* ── Recovery codes (after enable or regenerate) ── */}\n {step === 'recovery-codes' && (\n <>\n <h2 className=\"fc-modal-title\">Save your recovery codes</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Store these codes somewhere safe. Each code can only be used once.\n </p>\n <div className=\"fc-recovery-grid\">\n {recoveryCodes.map((c, i) => (\n <div key={i} className=\"fc-recovery-code\">{c}</div>\n ))}\n </div>\n <div style={{ textAlign: 'center', margin: '8px 0 12px' }}>\n <button type=\"button\" className=\"fc-link\" onClick={handleCopyAll}>\n Copy all\n </button>\n </div>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={onClose}>\n Done\n </button>\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { startRegistration } from '../runtime-imports.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { timeAgo } from '../lib/utils.js';\nimport type { Passkey } from '../types.js';\n\ninterface PasskeysModalProps {\n isOpen: boolean;\n onClose: () => void;\n onCountChange: (count: number) => void;\n}\n\nexport function PasskeysModal({ isOpen, onClose, onCountChange }: PasskeysModalProps) {\n const { api, getAccessToken, config } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [passkeys, setPasskeys] = useState<Passkey[]>([]);\n const [loading, setLoading] = useState(false);\n const [addLoading, setAddLoading] = useState(false);\n const [msg, setMsg] = useState('');\n\n const fetchPasskeys = useCallback(async () => {\n const token = getAccessToken();\n if (!token) return;\n setLoading(true);\n try {\n const list = await api.getPasskeys(token);\n setPasskeys(list);\n onCountChange(list.length);\n } catch {\n // silently fail\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken, onCountChange]);\n\n useEffect(() => {\n if (isOpen) {\n setMsg('');\n fetchPasskeys();\n }\n }, [isOpen, fetchPasskeys]);\n\n const handleAdd = async () => {\n const token = getAccessToken();\n if (!token) return;\n setAddLoading(true);\n setMsg('');\n try {\n const { options, challengeKey } = await api.getPasskeyRegisterOptions(token, config.webauthnRpId, config.webauthnOrigin);\n const regResponse = await startRegistration({ optionsJSON: options });\n const passkey = await api.verifyPasskeyRegistration(token, challengeKey, regResponse, undefined, config.webauthnRpId, config.webauthnOrigin);\n const updated = [...passkeys, passkey];\n setPasskeys(updated);\n onCountChange(updated.length);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not add passkey.');\n } finally {\n setAddLoading(false);\n }\n };\n\n const handleDelete = async (id: string) => {\n const token = getAccessToken();\n if (!token) return;\n setMsg('');\n try {\n await api.deletePasskey(token, id);\n const updated = passkeys.filter((p) => p.id !== id);\n setPasskeys(updated);\n onCountChange(updated.length);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not remove passkey.');\n }\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n <h2 className=\"fc-modal-title\">Passkeys</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Sign in without a password using biometrics or a security key.\n </p>\n\n {msg && <p className=\"fc-error\">{msg}</p>}\n {loading && <p className=\"fc-text\">Loading...</p>}\n\n <div className=\"fc-tab\">\n {passkeys.map((pk) => (\n <div key={pk.id} className=\"fc-account-item\">\n <span className=\"fc-account-item-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"8\" cy=\"7\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M13 13.5a5 5 0 0 0-10 0\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M15 10v4m0 0l-1.5-1m1.5 1l1.5-1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">{pk.name || 'Passkey'}</span>\n <span className=\"fc-account-item-detail\">\n {pk.deviceType ?? 'Unknown device'}\n {pk.lastUsedAt ? ` · Last used ${timeAgo(pk.lastUsedAt)}` : ''}\n </span>\n </div>\n <div className=\"fc-account-item-actions\">\n {pk.backedUp && <span className=\"fc-badge-verified\">Synced</span>}\n <button type=\"button\" className=\"fc-btn-danger-sm\" onClick={() => handleDelete(pk.id)}>\n Remove\n </button>\n </div>\n </div>\n ))}\n {!loading && passkeys.length === 0 && <p className=\"fc-account-empty\">No passkeys yet</p>}\n\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={handleAdd}\n disabled={addLoading}\n style={{ marginTop: 8 }}\n >\n {addLoading ? 'Adding...' : '+ Add passkey'}\n </button>\n </div>\n </div>\n </ModalOverlay>\n );\n}\n","/**\n * Convert the given array buffer into a Base64URL-encoded string. Ideal for converting various\n * credential response ArrayBuffers to string for sending back to the server as JSON.\n *\n * Helper method to compliment `base64URLStringToBuffer`\n */\nexport function bufferToBase64URLString(buffer) {\n const bytes = new Uint8Array(buffer);\n let str = '';\n for (const charCode of bytes) {\n str += String.fromCharCode(charCode);\n }\n const base64String = btoa(str);\n return base64String.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n","/**\n * Convert from a Base64URL-encoded string to an Array Buffer. Best used when converting a\n * credential ID from a JSON string to an ArrayBuffer, like in allowCredentials or\n * excludeCredentials\n *\n * Helper method to compliment `bufferToBase64URLString`\n */\nexport function base64URLStringToBuffer(base64URLString) {\n // Convert from Base64URL to Base64\n const base64 = base64URLString.replace(/-/g, '+').replace(/_/g, '/');\n /**\n * Pad with '=' until it's a multiple of four\n * (4 - (85 % 4 = 1) = 3) % 4 = 3 padding\n * (4 - (86 % 4 = 2) = 2) % 4 = 2 padding\n * (4 - (87 % 4 = 3) = 1) % 4 = 1 padding\n * (4 - (88 % 4 = 0) = 4) % 4 = 0 padding\n */\n const padLength = (4 - (base64.length % 4)) % 4;\n const padded = base64.padEnd(base64.length + padLength, '=');\n // Convert to a binary string\n const binary = atob(padded);\n // Convert binary string to buffer\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return buffer;\n}\n","/**\n * Determine if the browser is capable of Webauthn\n */\nexport function browserSupportsWebAuthn() {\n return _browserSupportsWebAuthnInternals.stubThis(globalThis?.PublicKeyCredential !== undefined &&\n typeof globalThis.PublicKeyCredential === 'function');\n}\n/**\n * Make it possible to stub the return value during testing\n * @ignore Don't include this in docs output\n */\nexport const _browserSupportsWebAuthnInternals = {\n stubThis: (value) => value,\n};\n","import { base64URLStringToBuffer } from './base64URLStringToBuffer.js';\nexport function toPublicKeyCredentialDescriptor(descriptor) {\n const { id } = descriptor;\n return {\n ...descriptor,\n id: base64URLStringToBuffer(id),\n /**\n * `descriptor.transports` is an array of our `AuthenticatorTransportFuture` that includes newer\n * transports that TypeScript's DOM lib is ignorant of. Convince TS that our list of transports\n * are fine to pass to WebAuthn since browsers will recognize the new value.\n */\n transports: descriptor.transports,\n };\n}\n","/**\n * A simple test to determine if a hostname is a properly-formatted domain name\n *\n * A \"valid domain\" is defined here: https://url.spec.whatwg.org/#valid-domain\n *\n * Regex sourced from here:\n * https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch08s15.html\n */\nexport function isValidDomain(hostname) {\n return (\n // Consider localhost valid as well since it's okay wrt Secure Contexts\n hostname === 'localhost' ||\n /^([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}$/i.test(hostname));\n}\n","/**\n * A custom Error used to return a more nuanced error detailing _why_ one of the eight documented\n * errors in the spec was raised after calling `navigator.credentials.create()` or\n * `navigator.credentials.get()`:\n *\n * - `AbortError`\n * - `ConstraintError`\n * - `InvalidStateError`\n * - `NotAllowedError`\n * - `NotSupportedError`\n * - `SecurityError`\n * - `TypeError`\n * - `UnknownError`\n *\n * Error messages were determined through investigation of the spec to determine under which\n * scenarios a given error would be raised.\n */\nexport class WebAuthnError extends Error {\n constructor({ message, code, cause, name, }) {\n // @ts-ignore: help Rollup understand that `cause` is okay to set\n super(message, { cause });\n Object.defineProperty(this, \"code\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.name = name ?? cause.name;\n this.code = code;\n }\n}\n","import { isValidDomain } from './isValidDomain.js';\nimport { WebAuthnError } from './webAuthnError.js';\n/**\n * Attempt to intuit _why_ an error was raised after calling `navigator.credentials.create()`\n */\nexport function identifyRegistrationError({ error, options, }) {\n const { publicKey } = options;\n if (!publicKey) {\n throw Error('options was missing required publicKey property');\n }\n if (error.name === 'AbortError') {\n if (options.signal instanceof AbortSignal) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 16)\n return new WebAuthnError({\n message: 'Registration ceremony was sent an abort signal',\n code: 'ERROR_CEREMONY_ABORTED',\n cause: error,\n });\n }\n }\n else if (error.name === 'ConstraintError') {\n if (publicKey.authenticatorSelection?.requireResidentKey === true) {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 4)\n return new WebAuthnError({\n message: 'Discoverable credentials were required but no available authenticator supported it',\n code: 'ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT',\n cause: error,\n });\n }\n else if (\n // @ts-ignore: `mediation` doesn't yet exist on CredentialCreationOptions but it's possible as of Sept 2024\n options.mediation === 'conditional' &&\n publicKey.authenticatorSelection?.userVerification === 'required') {\n // https://w3c.github.io/webauthn/#sctn-createCredential (Step 22.4)\n return new WebAuthnError({\n message: 'User verification was required during automatic registration but it could not be performed',\n code: 'ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE',\n cause: error,\n });\n }\n else if (publicKey.authenticatorSelection?.userVerification === 'required') {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 5)\n return new WebAuthnError({\n message: 'User verification was required but no available authenticator supported it',\n code: 'ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT',\n cause: error,\n });\n }\n }\n else if (error.name === 'InvalidStateError') {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 20)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 3)\n return new WebAuthnError({\n message: 'The authenticator was previously registered',\n code: 'ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED',\n cause: error,\n });\n }\n else if (error.name === 'NotAllowedError') {\n /**\n * Pass the error directly through. Platforms are overloading this error beyond what the spec\n * defines and we don't want to overwrite potentially useful error messages.\n */\n return new WebAuthnError({\n message: error.message,\n code: 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY',\n cause: error,\n });\n }\n else if (error.name === 'NotSupportedError') {\n const validPubKeyCredParams = publicKey.pubKeyCredParams.filter((param) => param.type === 'public-key');\n if (validPubKeyCredParams.length === 0) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 10)\n return new WebAuthnError({\n message: 'No entry in pubKeyCredParams was of type \"public-key\"',\n code: 'ERROR_MALFORMED_PUBKEYCREDPARAMS',\n cause: error,\n });\n }\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 2)\n return new WebAuthnError({\n message: 'No available authenticator supported any of the specified pubKeyCredParams algorithms',\n code: 'ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG',\n cause: error,\n });\n }\n else if (error.name === 'SecurityError') {\n const effectiveDomain = globalThis.location.hostname;\n if (!isValidDomain(effectiveDomain)) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 7)\n return new WebAuthnError({\n message: `${globalThis.location.hostname} is an invalid domain`,\n code: 'ERROR_INVALID_DOMAIN',\n cause: error,\n });\n }\n else if (publicKey.rp.id !== effectiveDomain) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 8)\n return new WebAuthnError({\n message: `The RP ID \"${publicKey.rp.id}\" is invalid for this domain`,\n code: 'ERROR_INVALID_RP_ID',\n cause: error,\n });\n }\n }\n else if (error.name === 'TypeError') {\n if (publicKey.user.id.byteLength < 1 || publicKey.user.id.byteLength > 64) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 5)\n return new WebAuthnError({\n message: 'User ID was not between 1 and 64 characters',\n code: 'ERROR_INVALID_USER_ID_LENGTH',\n cause: error,\n });\n }\n }\n else if (error.name === 'UnknownError') {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 1)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 8)\n return new WebAuthnError({\n message: 'The authenticator was unable to process the specified options, or could not create a new credential',\n code: 'ERROR_AUTHENTICATOR_GENERAL_ERROR',\n cause: error,\n });\n }\n return error;\n}\n","class BaseWebAuthnAbortService {\n constructor() {\n Object.defineProperty(this, \"controller\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n }\n createNewAbortSignal() {\n // Abort any existing calls to navigator.credentials.create() or navigator.credentials.get()\n if (this.controller) {\n const abortError = new Error('Cancelling existing WebAuthn API call for new one');\n abortError.name = 'AbortError';\n this.controller.abort(abortError);\n }\n const newController = new AbortController();\n this.controller = newController;\n return newController.signal;\n }\n cancelCeremony() {\n if (this.controller) {\n const abortError = new Error('Manually cancelling existing WebAuthn API call');\n abortError.name = 'AbortError';\n this.controller.abort(abortError);\n this.controller = undefined;\n }\n }\n}\n/**\n * A service singleton to help ensure that only a single WebAuthn ceremony is active at a time.\n *\n * Users of **@simplewebauthn/browser** shouldn't typically need to use this, but it can help e.g.\n * developers building projects that use client-side routing to better control the behavior of\n * their UX in response to router navigation events.\n */\nexport const WebAuthnAbortService = new BaseWebAuthnAbortService();\n","const attachments = ['cross-platform', 'platform'];\n/**\n * If possible coerce a `string` value into a known `AuthenticatorAttachment`\n */\nexport function toAuthenticatorAttachment(attachment) {\n if (!attachment) {\n return;\n }\n if (attachments.indexOf(attachment) < 0) {\n return;\n }\n return attachment;\n}\n","import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString.js';\nimport { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.js';\nimport { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.js';\nimport { toPublicKeyCredentialDescriptor } from '../helpers/toPublicKeyCredentialDescriptor.js';\nimport { identifyRegistrationError } from '../helpers/identifyRegistrationError.js';\nimport { WebAuthnAbortService } from '../helpers/webAuthnAbortService.js';\nimport { toAuthenticatorAttachment } from '../helpers/toAuthenticatorAttachment.js';\n/**\n * Begin authenticator \"registration\" via WebAuthn attestation\n *\n * @param optionsJSON Output from **@simplewebauthn/server**'s `generateRegistrationOptions()`\n * @param useAutoRegister (Optional) Try to silently create a passkey with the password manager that the user just signed in with. Defaults to `false`.\n */\nexport async function startRegistration(options) {\n // @ts-ignore: Intentionally check for old call structure to warn about improper API call\n if (!options.optionsJSON && options.challenge) {\n console.warn('startRegistration() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information.');\n // @ts-ignore: Reassign the options, passed in as a positional argument, to the expected variable\n options = { optionsJSON: options };\n }\n const { optionsJSON, useAutoRegister = false } = options;\n if (!browserSupportsWebAuthn()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n // We need to convert some values to Uint8Arrays before passing the credentials to the navigator\n const publicKey = {\n ...optionsJSON,\n challenge: base64URLStringToBuffer(optionsJSON.challenge),\n user: {\n ...optionsJSON.user,\n id: base64URLStringToBuffer(optionsJSON.user.id),\n },\n excludeCredentials: optionsJSON.excludeCredentials?.map(toPublicKeyCredentialDescriptor),\n };\n // Prepare options for `.create()`\n const createOptions = {};\n /**\n * Try to use conditional create to register a passkey for the user with the password manager\n * the user just used to authenticate with. The user won't be shown any prominent UI by the\n * browser.\n */\n if (useAutoRegister) {\n // @ts-ignore: `mediation` doesn't yet exist on CredentialCreationOptions but it's possible as of Sept 2024\n createOptions.mediation = 'conditional';\n }\n // Finalize options\n createOptions.publicKey = publicKey;\n // Set up the ability to cancel this request if the user attempts another\n createOptions.signal = WebAuthnAbortService.createNewAbortSignal();\n // Wait for the user to complete attestation\n let credential;\n try {\n credential = (await navigator.credentials.create(createOptions));\n }\n catch (err) {\n throw identifyRegistrationError({ error: err, options: createOptions });\n }\n if (!credential) {\n throw new Error('Registration was not completed');\n }\n const { id, rawId, response, type } = credential;\n // Continue to play it safe with `getTransports()` for now, even when L3 types say it's required\n let transports = undefined;\n if (typeof response.getTransports === 'function') {\n transports = response.getTransports();\n }\n // L3 says this is required, but browser and webview support are still not guaranteed.\n let responsePublicKeyAlgorithm = undefined;\n if (typeof response.getPublicKeyAlgorithm === 'function') {\n try {\n responsePublicKeyAlgorithm = response.getPublicKeyAlgorithm();\n }\n catch (error) {\n warnOnBrokenImplementation('getPublicKeyAlgorithm()', error);\n }\n }\n let responsePublicKey = undefined;\n if (typeof response.getPublicKey === 'function') {\n try {\n const _publicKey = response.getPublicKey();\n if (_publicKey !== null) {\n responsePublicKey = bufferToBase64URLString(_publicKey);\n }\n }\n catch (error) {\n warnOnBrokenImplementation('getPublicKey()', error);\n }\n }\n // L3 says this is required, but browser and webview support are still not guaranteed.\n let responseAuthenticatorData;\n if (typeof response.getAuthenticatorData === 'function') {\n try {\n responseAuthenticatorData = bufferToBase64URLString(response.getAuthenticatorData());\n }\n catch (error) {\n warnOnBrokenImplementation('getAuthenticatorData()', error);\n }\n }\n return {\n id,\n rawId: bufferToBase64URLString(rawId),\n response: {\n attestationObject: bufferToBase64URLString(response.attestationObject),\n clientDataJSON: bufferToBase64URLString(response.clientDataJSON),\n transports,\n publicKeyAlgorithm: responsePublicKeyAlgorithm,\n publicKey: responsePublicKey,\n authenticatorData: responseAuthenticatorData,\n },\n type,\n clientExtensionResults: credential.getClientExtensionResults(),\n authenticatorAttachment: toAuthenticatorAttachment(credential.authenticatorAttachment),\n };\n}\n/**\n * Visibly warn when we detect an issue related to a passkey provider intercepting WebAuthn API\n * calls\n */\nfunction warnOnBrokenImplementation(methodName, cause) {\n console.warn(`The browser extension that intercepted this WebAuthn API call incorrectly implemented ${methodName}. You should report this error to them.\\n`, cause);\n}\n","import { browserSupportsWebAuthn } from './browserSupportsWebAuthn.js';\n/**\n * Determine if the browser supports conditional UI, so that WebAuthn credentials can\n * be shown to the user in the browser's typical password autofill popup.\n */\nexport function browserSupportsWebAuthnAutofill() {\n if (!browserSupportsWebAuthn()) {\n return _browserSupportsWebAuthnAutofillInternals.stubThis(new Promise((resolve) => resolve(false)));\n }\n /**\n * I don't like the `as unknown` here but there's a `declare var PublicKeyCredential` in\n * TS' DOM lib that's making it difficult for me to just go `as PublicKeyCredentialFuture` as I\n * want. I think I'm fine with this for now since it's _supposed_ to be temporary, until TS types\n * have a chance to catch up.\n */\n const globalPublicKeyCredential = globalThis\n .PublicKeyCredential;\n if (globalPublicKeyCredential?.isConditionalMediationAvailable === undefined) {\n return _browserSupportsWebAuthnAutofillInternals.stubThis(new Promise((resolve) => resolve(false)));\n }\n return _browserSupportsWebAuthnAutofillInternals.stubThis(globalPublicKeyCredential.isConditionalMediationAvailable());\n}\n// Make it possible to stub the return value during testing\nexport const _browserSupportsWebAuthnAutofillInternals = {\n stubThis: (value) => value,\n};\n","import { isValidDomain } from './isValidDomain.js';\nimport { WebAuthnError } from './webAuthnError.js';\n/**\n * Attempt to intuit _why_ an error was raised after calling `navigator.credentials.get()`\n */\nexport function identifyAuthenticationError({ error, options, }) {\n const { publicKey } = options;\n if (!publicKey) {\n throw Error('options was missing required publicKey property');\n }\n if (error.name === 'AbortError') {\n if (options.signal instanceof AbortSignal) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 16)\n return new WebAuthnError({\n message: 'Authentication ceremony was sent an abort signal',\n code: 'ERROR_CEREMONY_ABORTED',\n cause: error,\n });\n }\n }\n else if (error.name === 'NotAllowedError') {\n /**\n * Pass the error directly through. Platforms are overloading this error beyond what the spec\n * defines and we don't want to overwrite potentially useful error messages.\n */\n return new WebAuthnError({\n message: error.message,\n code: 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY',\n cause: error,\n });\n }\n else if (error.name === 'SecurityError') {\n const effectiveDomain = globalThis.location.hostname;\n if (!isValidDomain(effectiveDomain)) {\n // https://www.w3.org/TR/webauthn-2/#sctn-discover-from-external-source (Step 5)\n return new WebAuthnError({\n message: `${globalThis.location.hostname} is an invalid domain`,\n code: 'ERROR_INVALID_DOMAIN',\n cause: error,\n });\n }\n else if (publicKey.rpId !== effectiveDomain) {\n // https://www.w3.org/TR/webauthn-2/#sctn-discover-from-external-source (Step 6)\n return new WebAuthnError({\n message: `The RP ID \"${publicKey.rpId}\" is invalid for this domain`,\n code: 'ERROR_INVALID_RP_ID',\n cause: error,\n });\n }\n }\n else if (error.name === 'UnknownError') {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-get-assertion (Step 1)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-get-assertion (Step 12)\n return new WebAuthnError({\n message: 'The authenticator was unable to process the specified options, or could not create a new assertion signature',\n code: 'ERROR_AUTHENTICATOR_GENERAL_ERROR',\n cause: error,\n });\n }\n return error;\n}\n","import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString.js';\nimport { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.js';\nimport { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.js';\nimport { browserSupportsWebAuthnAutofill } from '../helpers/browserSupportsWebAuthnAutofill.js';\nimport { toPublicKeyCredentialDescriptor } from '../helpers/toPublicKeyCredentialDescriptor.js';\nimport { identifyAuthenticationError } from '../helpers/identifyAuthenticationError.js';\nimport { WebAuthnAbortService } from '../helpers/webAuthnAbortService.js';\nimport { toAuthenticatorAttachment } from '../helpers/toAuthenticatorAttachment.js';\n/**\n * Begin authenticator \"login\" via WebAuthn assertion\n *\n * @param optionsJSON Output from **@simplewebauthn/server**'s `generateAuthenticationOptions()`\n * @param useBrowserAutofill (Optional) Initialize conditional UI to enable logging in via browser autofill prompts. Defaults to `false`.\n * @param verifyBrowserAutofillInput (Optional) Ensure a suitable `<input>` element is present when `useBrowserAutofill` is `true`. Defaults to `true`.\n */\nexport async function startAuthentication(options) {\n // @ts-ignore: Intentionally check for old call structure to warn about improper API call\n if (!options.optionsJSON && options.challenge) {\n console.warn('startAuthentication() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information.');\n // @ts-ignore: Reassign the options, passed in as a positional argument, to the expected variable\n options = { optionsJSON: options };\n }\n const { optionsJSON, useBrowserAutofill = false, verifyBrowserAutofillInput = true, } = options;\n if (!browserSupportsWebAuthn()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n // We need to avoid passing empty array to avoid blocking retrieval\n // of public key\n let allowCredentials;\n if (optionsJSON.allowCredentials?.length !== 0) {\n allowCredentials = optionsJSON.allowCredentials?.map(toPublicKeyCredentialDescriptor);\n }\n // We need to convert some values to Uint8Arrays before passing the credentials to the navigator\n const publicKey = {\n ...optionsJSON,\n challenge: base64URLStringToBuffer(optionsJSON.challenge),\n allowCredentials,\n };\n // Prepare options for `.get()`\n const getOptions = {};\n /**\n * Set up the page to prompt the user to select a credential for authentication via the browser's\n * input autofill mechanism.\n */\n if (useBrowserAutofill) {\n if (!(await browserSupportsWebAuthnAutofill())) {\n throw Error('Browser does not support WebAuthn autofill');\n }\n // Check for an <input> with \"webauthn\" in its `autocomplete` attribute\n const eligibleInputs = document.querySelectorAll(\"input[autocomplete$='webauthn']\");\n // WebAuthn autofill requires at least one valid input\n if (eligibleInputs.length < 1 && verifyBrowserAutofillInput) {\n throw Error('No <input> with \"webauthn\" as the only or last value in its `autocomplete` attribute was detected');\n }\n // `CredentialMediationRequirement` doesn't know about \"conditional\" yet as of\n // typescript@4.6.3\n getOptions.mediation = 'conditional';\n // Conditional UI requires an empty allow list\n publicKey.allowCredentials = [];\n }\n // Finalize options\n getOptions.publicKey = publicKey;\n // Set up the ability to cancel this request if the user attempts another\n getOptions.signal = WebAuthnAbortService.createNewAbortSignal();\n // Wait for the user to complete assertion\n let credential;\n try {\n credential = (await navigator.credentials.get(getOptions));\n }\n catch (err) {\n throw identifyAuthenticationError({ error: err, options: getOptions });\n }\n if (!credential) {\n throw new Error('Authentication was not completed');\n }\n const { id, rawId, response, type } = credential;\n let userHandle = undefined;\n if (response.userHandle) {\n userHandle = bufferToBase64URLString(response.userHandle);\n }\n // Convert values to base64 to make it easier to send back to the server\n return {\n id,\n rawId: bufferToBase64URLString(rawId),\n response: {\n authenticatorData: bufferToBase64URLString(response.authenticatorData),\n clientDataJSON: bufferToBase64URLString(response.clientDataJSON),\n signature: bufferToBase64URLString(response.signature),\n userHandle,\n },\n type,\n clientExtensionResults: credential.getClientExtensionResults(),\n authenticatorAttachment: toAuthenticatorAttachment(credential.authenticatorAttachment),\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { ErrorView } from './error-view.js';\n\ninterface PasswordModalProps {\n isOpen: boolean;\n onClose: () => void;\n hasPassword: boolean;\n}\n\ntype Step = 'form' | 'done' | 'error';\n\nexport function PasswordModal({ isOpen, onClose, hasPassword }: PasswordModalProps) {\n const { api, getAccessToken, config } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [step, setStep] = useState<Step>('form');\n const [currentPassword, setCurrentPassword] = useState('');\n const [newPassword, setNewPassword] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n useEffect(() => {\n if (isOpen) {\n setStep('form');\n setCurrentPassword('');\n setNewPassword('');\n setError('');\n setLoading(false);\n }\n }, [isOpen]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.setPassword(token, newPassword, hasPassword ? currentPassword : undefined);\n setStep('done');\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Could not set your password. Please try again.';\n setError(msg);\n setStep('error');\n } finally {\n setLoading(false);\n }\n };\n\n const title = hasPassword ? 'Change password' : 'Set a password';\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {step === 'done' ? (\n <div className=\"fc-tab\" style={{ textAlign: 'center', padding: '24px 0' }}>\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Password {hasPassword ? 'updated' : 'set'}</p>\n </div>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={onClose} style={{ marginTop: 16 }}>\n Done\n </button>\n </div>\n ) : step === 'error' ? (\n <ErrorView\n title=\"Password update failed\"\n message={error}\n onRetry={() => setStep('form')}\n onClose={onClose}\n />\n ) : (\n <>\n <h2 className=\"fc-modal-title\">{title}</h2>\n <div className=\"fc-tab\">\n <form onSubmit={handleSubmit} className=\"fc-form\">\n {hasPassword && (\n <label className=\"fc-label\">\n Current password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={currentPassword}\n onChange={(e) => setCurrentPassword(e.target.value)}\n placeholder=\"Enter current password\"\n required\n autoComplete=\"current-password\"\n />\n </label>\n )}\n <label className=\"fc-label\">\n New password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n placeholder=\"8+ characters\"\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Saving...' : hasPassword ? 'Update password' : 'Set password'}\n </button>\n </form>\n </div>\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n","export interface ErrorViewProps {\n title?: string;\n message?: string;\n onRetry?: () => void;\n onClose?: () => void;\n}\n\nexport function ErrorView({\n title = 'Something went wrong',\n message,\n onRetry,\n onClose,\n}: ErrorViewProps) {\n return (\n <div className=\"fc-error-view\">\n <div className=\"fc-error-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-error-check\">\n <circle className=\"fc-error-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <line className=\"fc-error-cross-1\" x1=\"16\" y1=\"16\" x2=\"36\" y2=\"36\" />\n <line className=\"fc-error-cross-2\" x1=\"36\" y1=\"16\" x2=\"16\" y2=\"36\" />\n </svg>\n </div>\n <p className=\"fc-error-text\">{title}</p>\n {message && <p className=\"fc-error-subtext\">{message}</p>}\n {(onRetry || onClose) && (\n <div className=\"fc-error-actions\">\n {onRetry && (\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={onRetry}>\n Try again\n </button>\n )}\n {onClose && (\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={onClose}>\n Close\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { ErrorView } from './error-view.js';\n\ninterface DeleteAccountModalProps {\n isOpen: boolean;\n onClose: () => void;\n onDeleted: () => void;\n}\n\ntype Step = 'confirm' | 'code' | 'done' | 'error';\n\nexport function DeleteAccountModal({ isOpen, onClose, onDeleted }: DeleteAccountModalProps) {\n const { api, getAccessToken, config, logout } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [step, setStep] = useState<Step>('confirm');\n const [code, setCode] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n useEffect(() => {\n if (isOpen) {\n setStep('confirm');\n setCode('');\n setError('');\n setLoading(false);\n }\n }, [isOpen]);\n\n const handleDelete = async () => {\n setError('');\n setLoading(true);\n try {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const { requiresVerification } = await api.requestAccountDeletion(token);\n if (requiresVerification) {\n setStep('code');\n } else {\n await api.confirmAccountDeletion(token);\n setStep('done');\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Something went wrong. Please try again.';\n setError(msg);\n setStep('error');\n } finally {\n setLoading(false);\n }\n };\n\n const handleConfirmCode = async (e: React.FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.confirmAccountDeletion(token, code);\n setStep('done');\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Something went wrong. Please try again.';\n setError(msg);\n setStep('error');\n } finally {\n setLoading(false);\n }\n };\n\n const handleDone = () => {\n logout();\n onDeleted();\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={step === 'done' ? handleDone : onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {step === 'confirm' && (\n <>\n <h2 className=\"fc-modal-title\">Delete account</h2>\n <div className=\"fc-tab\" style={{ textAlign: 'center' }}>\n <p className=\"fc-account-section-desc\">\n This will permanently delete your account and all associated data. This action cannot be undone.\n </p>\n {error && <p className=\"fc-error\">{error}</p>}\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={handleDelete}\n disabled={loading}\n style={{ marginTop: 12, background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n {loading ? 'Processing...' : 'Delete my account'}\n </button>\n <div style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={onClose}>Cancel</button>\n </div>\n </div>\n </>\n )}\n\n {step === 'code' && (\n <>\n <h2 className=\"fc-modal-title\">Verify your identity</h2>\n <div className=\"fc-tab\">\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Enter the 6-digit code sent to your email to confirm deletion.\n </p>\n {error && <p className=\"fc-error\">{error}</p>}\n <form onSubmit={handleConfirmCode} className=\"fc-form\">\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"submit\"\n className=\"fc-btn fc-btn-secondary\"\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10, background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n {loading ? 'Deleting...' : 'Delete my account'}\n </button>\n </form>\n <div style={{ marginTop: 12, textAlign: 'center' }}>\n <button type=\"button\" className=\"fc-link\" onClick={onClose}>Cancel</button>\n </div>\n </div>\n </>\n )}\n\n {step === 'done' && (\n <div className=\"fc-tab\" style={{ textAlign: 'center', padding: '24px 0' }}>\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Account deleted</p>\n </div>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={handleDone} style={{ marginTop: 16 }}>\n Done\n </button>\n </div>\n )}\n\n {step === 'error' && (\n <ErrorView\n title=\"Deletion failed\"\n message={error}\n onRetry={() => setStep('confirm')}\n onClose={onClose}\n />\n )}\n </div>\n </ModalOverlay>\n );\n}\n","import { useState, useEffect, useMemo, useRef, useCallback } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { useUser } from '../hooks/use-user.js';\nimport { useWallets } from '../hooks/use-wallets.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { ErrorView } from './error-view.js';\nimport { PROVIDER_INFO } from './tabs/oauth-buttons.js';\nimport { SvgIcon } from './svg-icon.js';\nimport { MOBILE_WALLETS, isMobile } from './tabs/wallet-connect.js';\nimport { resolveLoginMethods, isOAuthMethod } from '../resolve-config.js';\nimport type { OAuthProvider } from '../types.js';\n\ntype LinkStep = 'method-select' | 'email' | 'otp' | 'wallet' | 'success' | 'error';\n\nexport function LinkAuthModal() {\n const { linkModal, closeLinkModal, config } = useForgeConnect();\n const { linkOAuth, authMethods } = useUser();\n const mode = linkModal.mode ?? 'auth';\n const [step, setStep] = useState<LinkStep>('method-select');\n const [fatalError, setFatalError] = useState('');\n\n // When modal opens, set the correct initial step\n useEffect(() => {\n if (linkModal.isOpen) {\n setStep(mode === 'wallet' ? 'wallet' : 'method-select');\n setFatalError('');\n }\n }, [linkModal.isOpen, mode]);\n\n // Listen for OAuth link success (popup sends postMessage)\n useEffect(() => {\n if (!linkModal.isOpen) return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) return;\n if (event.data?.type === 'fc_oauth_link_success') {\n setStep('success');\n setTimeout(() => {\n handleClose();\n }, 1500);\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [linkModal.isOpen]);\n\n if (!linkModal.isOpen) return null;\n\n const theme = config.appearance?.theme ?? 'light';\n\n const handleClose = () => {\n setStep('method-select');\n closeLinkModal();\n };\n\n const handleSuccess = () => {\n setStep('success');\n setTimeout(() => {\n handleClose();\n }, 1500);\n };\n\n const handleOAuthDirect = (provider: string) => {\n linkOAuth(provider);\n };\n\n const handleFatalError = (msg: string) => {\n setFatalError(msg);\n setStep('error');\n };\n\n const title = step === 'success' || step === 'error'\n ? ''\n : step === 'email'\n ? 'Link email'\n : step === 'otp'\n ? 'Link email'\n : mode === 'wallet' || step === 'wallet'\n ? 'Connect wallet'\n : 'Link a method';\n\n return (\n <ModalOverlay isOpen={linkModal.isOpen} onClose={handleClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {step === 'success' ? (\n <SuccessView />\n ) : step === 'error' ? (\n <ErrorView\n title=\"Linking failed\"\n message={fatalError}\n onRetry={() => setStep(mode === 'wallet' ? 'wallet' : 'method-select')}\n onClose={handleClose}\n />\n ) : (\n <>\n <h2 className=\"fc-modal-title\">{title}</h2>\n {step === 'method-select' && (\n <AuthMethodSelectStep\n config={config}\n connectedProviders={authMethods?.map(m => m.provider) ?? []}\n onSelectEmail={() => setStep('email')}\n onSelectOtp={() => setStep('otp')}\n onOAuth={handleOAuthDirect}\n />\n )}\n {step === 'email' && (\n <EmailLinkStep\n onBack={mode === 'wallet' ? undefined : () => setStep('method-select')}\n onSuccess={handleSuccess}\n onFatalError={handleFatalError}\n />\n )}\n {step === 'otp' && (\n <OtpLinkStep\n onBack={() => setStep('method-select')}\n onSuccess={handleSuccess}\n onFatalError={handleFatalError}\n />\n )}\n {step === 'wallet' && (\n <WalletLinkStep\n onBack={mode === 'wallet' ? undefined : () => setStep('method-select')}\n onSuccess={handleSuccess}\n onFatalError={handleFatalError}\n />\n )}\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n\n// ── Icons ──\n\nconst EmailIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\nconst MagicCodeIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"3\" y=\"5\" width=\"14\" height=\"10\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M7 10h1.5M9.5 10h1M11.5 10h1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\n// ── Auth Method Select (socials + email + otp, filtered) ──\n\nfunction AuthMethodSelectStep({\n config,\n connectedProviders,\n onSelectEmail,\n onSelectOtp,\n onOAuth,\n}: {\n config: import('../types.js').ForgeConnectConfig;\n connectedProviders: string[];\n onSelectEmail: () => void;\n onSelectOtp: () => void;\n onOAuth: (provider: string) => void;\n}) {\n const methods = resolveLoginMethods(config);\n const connectedSet = new Set(connectedProviders);\n const hasEmail = connectedSet.has('email');\n\n // Filter: only auth methods from config (no wallet/passkey), exclude already-connected\n const availableMethods = methods.filter((m) => {\n if (m === 'wallet' || m === 'passkey') return false;\n // Both email and otp link an email — skip if email already connected\n if (m === 'email') return !hasEmail;\n if (m === 'otp') return !hasEmail;\n if (isOAuthMethod(m)) return !connectedSet.has(m);\n return false;\n });\n\n if (availableMethods.length === 0) {\n return (\n <div className=\"fc-tab\">\n <p className=\"fc-text\">All available login methods are already connected.</p>\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n {availableMethods.map((method) => {\n if (method === 'email') {\n return (\n <button key=\"email\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={onSelectEmail}>\n <EmailIcon /> <span className=\"fc-btn-name\">Email &amp; password</span>\n </button>\n );\n }\n\n if (method === 'otp') {\n return (\n <button key=\"otp\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={onSelectOtp}>\n <MagicCodeIcon /> <span className=\"fc-btn-name\">Magic code</span>\n </button>\n );\n }\n\n // OAuth provider\n const provider = method as OAuthProvider;\n const info = PROVIDER_INFO[provider];\n if (!info) return null;\n\n return (\n <button\n key={provider}\n type=\"button\"\n className=\"fc-btn fc-btn-method\"\n onClick={() => onOAuth(provider)}\n >\n <SvgIcon svg={info.icon} className=\"fc-oauth-icon\" />\n <span className=\"fc-btn-name\">{info.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\n// ── Email Link Step ──\n\nfunction EmailLinkStep({ onBack, onSuccess, onFatalError }: { onBack?: () => void; onSuccess: () => void; onFatalError: (msg: string) => void }) {\n const { linkAuthMethod } = useUser();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError('');\n try {\n await linkAuthMethod({ provider: 'email', email, password });\n onSuccess();\n } catch (err: unknown) {\n onFatalError(err instanceof Error ? err.message : 'Could not link this email. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {error && <p className=\"fc-error\">{error}</p>}\n <form className=\"fc-form\" onSubmit={handleSubmit}>\n <label className=\"fc-label\">\n Email\n <input className=\"fc-input\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} required placeholder=\"you@example.com\" />\n </label>\n <label className=\"fc-label\">\n Password\n <input className=\"fc-input\" type=\"password\" value={password} onChange={(e) => setPassword(e.target.value)} required minLength={8} placeholder=\"8+ characters\" />\n </label>\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Linking...' : 'Link email'}\n </button>\n </form>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n}\n\n// ── OTP Link Step (magic code) ──\n\nfunction OtpLinkStep({ onBack, onSuccess, onFatalError }: { onBack?: () => void; onSuccess: () => void; onFatalError: (msg: string) => void }) {\n const { linkOtpSend, linkOtpVerify } = useUser();\n const [email, setEmail] = useState('');\n const [code, setCode] = useState('');\n const [codeSent, setCodeSent] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n const handleSendCode = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError('');\n try {\n await linkOtpSend(email);\n setCodeSent(true);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not send code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerifyCode = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError('');\n try {\n await linkOtpVerify(email, code);\n onSuccess();\n } catch (err: unknown) {\n onFatalError(err instanceof Error ? err.message : 'Invalid code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n if (!codeSent) {\n return (\n <div className=\"fc-tab\">\n {error && <p className=\"fc-error\">{error}</p>}\n <form className=\"fc-form\" onSubmit={handleSendCode}>\n <label className=\"fc-label\">\n Email\n <input className=\"fc-input\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} required placeholder=\"you@example.com\" />\n </label>\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Sending...' : 'Send code'}\n </button>\n </form>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <p className=\"fc-text\">A 6-digit code was sent to <strong>{email}</strong></p>\n {error && <p className=\"fc-error\">{error}</p>}\n <form className=\"fc-form\" onSubmit={handleVerifyCode}>\n <label className=\"fc-label\">\n Code\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]{6}\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, '').slice(0, 6))}\n required\n placeholder=\"000000\"\n autoFocus\n />\n </label>\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading || code.length !== 6}>\n {loading ? 'Verifying...' : 'Verify & link'}\n </button>\n </form>\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => { setCodeSent(false); setCode(''); setError(''); }}>\n Use a different email\n </button>\n </div>\n </div>\n );\n}\n\n// ── Wallet Link Step ──\n\nfunction WalletLinkStep({ onBack, onSuccess, onFatalError }: { onBack?: () => void; onSuccess: () => void; onFatalError: (msg: string) => void }) {\n const { walletAdapter, config } = useForgeConnect();\n const { linkWallet } = useWallets();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [showOther, setShowOther] = useState(false);\n const [coldWallet, setColdWallet] = useState(false);\n const mobile = useMemo(() => isMobile(), []);\n const walletConfig = config.walletConfig;\n const preferred = walletConfig?.preferredWallets ?? [];\n const onlyPreferred = walletConfig?.onlyPreferred ?? false;\n\n const coldWalletRef = useRef(coldWallet);\n coldWalletRef.current = coldWallet;\n\n const buildSignTxFnForAdapter = useCallback((adapter: any): ((txBase64: string) => Promise<string>) | undefined => {\n if (!adapter.signTransaction) return undefined;\n const TxClass = walletConfig?.Transaction;\n if (!TxClass) return undefined;\n return async (txBase64: string) => {\n const bytes = Uint8Array.from(atob(txBase64), (c) => c.charCodeAt(0));\n const tx = TxClass.from(bytes);\n const signedTx = await adapter.signTransaction(tx);\n return btoa(String.fromCharCode(...new Uint8Array(signedTx.serialize())));\n };\n }, [walletConfig?.Transaction]);\n\n const wallet = walletAdapter!;\n\n const handleConnect = async (w: NonNullable<typeof walletAdapter>['wallets'][0]) => {\n if (w.readyState !== 'Installed') {\n if (mobile) {\n const mw = MOBILE_WALLETS.find((m) => m.name === w.adapter.name);\n if (mw) { window.location.href = mw.buildUrl(window.location.href); return; }\n }\n const url = (w.adapter as any).url;\n if (url) window.open(url, '_blank');\n return;\n }\n\n setError('');\n setLoading(true);\n try {\n // Select in React context (propagates wallet state to the rest of the app)\n wallet.select(w.adapter.name);\n\n // Connect via the raw adapter (select is async state — adapter is immediate)\n if (!w.adapter.connected) await (w.adapter as any).connect();\n\n const pk = w.adapter.publicKey;\n if (!pk) throw new Error('Wallet did not provide a public key.');\n const useCold = coldWalletRef.current;\n const adapterSignMessage = (w.adapter as any).signMessage\n ? (msg: Uint8Array) => (w.adapter as any).signMessage(msg)\n : undefined;\n await linkWallet(\n pk.toBase58(),\n useCold ? undefined : adapterSignMessage,\n 'solana',\n useCold ? buildSignTxFnForAdapter(w.adapter) : undefined,\n );\n onSuccess();\n } catch (err: unknown) {\n onFatalError(err instanceof Error ? err.message : 'Could not link this wallet. Please try again.');\n }\n };\n\n const { preferredWallets, otherWallets } = useMemo(() => {\n if (!walletAdapter) return { preferredWallets: [] as any[], otherWallets: [] as any[] };\n const all = walletAdapter.wallets;\n const prefList = preferred\n .map((name) => all.find((w) => w.adapter.name === name))\n .filter(Boolean) as typeof all;\n if (onlyPreferred && preferred.length > 0) return { preferredWallets: prefList, otherWallets: [] as typeof all };\n const prefSet = new Set(preferred);\n const others = all.filter((w) => !prefSet.has(w.adapter.name) && w.readyState === 'Installed');\n return { preferredWallets: prefList, otherWallets: others };\n }, [walletAdapter?.wallets, walletConfig]);\n\n const mobileExtraWallets = useMemo(() => {\n if (!mobile || !walletAdapter) return [];\n const adapterNames = new Set(walletAdapter.wallets.map((w) => w.adapter.name));\n return MOBILE_WALLETS.filter((mw) => !adapterNames.has(mw.name));\n }, [mobile, walletAdapter?.wallets]);\n\n // Mobile without wallet adapter — show deep links\n if (!walletAdapter && mobile) {\n return (\n <div className=\"fc-tab\">\n <div className=\"fc-wallet-list\">\n {MOBILE_WALLETS.map((mw) => (\n <button key={mw.name} type=\"button\" className=\"fc-btn fc-btn-wallet\"\n onClick={() => { window.location.href = mw.buildUrl(window.location.href); }}>\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-preferred\">Open app</span>\n </button>\n ))}\n </div>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n }\n\n // No wallet adapter at all\n if (!walletAdapter) {\n return (\n <div className=\"fc-tab\">\n <p className=\"fc-text\">\n No wallet adapter detected. Pass <code>walletAdapter</code> to{' '}\n <code>&lt;ForgeConnectProvider&gt;</code> to enable wallet connection.\n </p>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n {loading ? (\n <div style={{ textAlign: 'center', padding: '24px 0' }}>\n <p className=\"fc-tab-title\">Connecting...</p>\n <p className=\"fc-text\">\n {coldWallet\n ? 'Confirm the transaction on your device'\n : 'Approve the connection, then sign the verification request in your wallet'}\n </p>\n {error && (\n <>\n <p className=\"fc-error\">{error}</p>\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\"\n onClick={() => { setLoading(false); setError(''); }} style={{ marginTop: 8 }}>\n Try again\n </button>\n </>\n )}\n </div>\n ) : (\n <>\n <div className=\"fc-wallet-list\">\n {preferredWallets.map((w: any) => {\n const installed = w.readyState === 'Installed';\n return (\n <button key={w.adapter.name} type=\"button\" className=\"fc-btn fc-btn-wallet\" onClick={() => handleConnect(w)}>\n <span className={installed ? 'fc-installed-dot' : ''} style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n <span className=\"fc-badge-preferred\">Preferred</span>\n {!installed && mobile && MOBILE_WALLETS.some((mw) => mw.name === w.adapter.name)\n ? <span className=\"fc-badge-install\">Open app</span>\n : !installed && <span className=\"fc-badge-install\">Install</span>\n }\n </button>\n );\n })}\n {mobileExtraWallets.map((mw) => (\n <button key={mw.name} type=\"button\" className=\"fc-btn fc-btn-wallet\"\n onClick={() => { window.location.href = mw.buildUrl(window.location.href); }}>\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-install\">Open app</span>\n </button>\n ))}\n {otherWallets.length > 0 && !showOther && (\n <button type=\"button\" className=\"fc-btn fc-btn-wallet\" onClick={() => setShowOther(true)}>\n <span className=\"fc-other-wallets-icon\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 7h16\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"11\" y=\"10\" width=\"7\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </span>\n <span className=\"fc-wallet-name\">Other wallets</span>\n </button>\n )}\n {showOther && otherWallets.map((w: any) => (\n <button key={w.adapter.name} type=\"button\" className=\"fc-btn fc-btn-wallet\" onClick={() => handleConnect(w)}>\n <span className=\"fc-installed-dot\" style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n </button>\n ))}\n </div>\n {preferredWallets.length === 0 && otherWallets.length === 0 && mobileExtraWallets.length === 0 && (\n <p className=\"fc-text\">No wallet found. Please install a Solana wallet (like Phantom) to continue.</p>\n )}\n\n {walletConfig?.Transaction && (\n <label className=\"fc-cold-wallet-toggle\">\n <input\n type=\"checkbox\"\n checked={coldWallet}\n onChange={(e) => setColdWallet(e.target.checked)}\n />\n <span className=\"fc-toggle-track\" />\n <span className=\"fc-cold-wallet-label\">\n <span>Hardware wallet</span>\n <span>Ledger, Trezor, Keystone...</span>\n </span>\n </label>\n )}\n\n {error && <p className=\"fc-error\">{error}</p>}\n </>\n )}\n {!loading && onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Success View ──\n\nfunction SuccessView() {\n return (\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Linked</p>\n </div>\n );\n}\n","import { useForgeConnect } from '../hooks/use-forge-connect';\n\ninterface LoginButtonProps {\n className?: string;\n label?: string;\n}\n\nexport function LoginButton({ className, label }: LoginButtonProps) {\n const { auth, openModal, logout } = useForgeConnect();\n\n if (auth.status === 'loading') {\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} disabled>\n Loading...\n </button>\n );\n }\n\n if (auth.status === 'authenticated') {\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} onClick={logout}>\n {label ?? 'Log out'}\n </button>\n );\n }\n\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} onClick={openModal}>\n {label ?? 'Sign in'}\n </button>\n );\n}\n","import { useForgeConnect } from '../hooks/use-forge-connect.js';\n\ninterface AccountButtonProps {\n className?: string;\n loginLabel?: string;\n compact?: boolean;\n}\n\nexport function AccountButton({ className, loginLabel, compact }: AccountButtonProps) {\n const { auth, openModal, openAccountModal } = useForgeConnect();\n\n if (auth.status === 'loading') {\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} disabled>\n Loading...\n </button>\n );\n }\n\n if (auth.status === 'authenticated' && auth.user) {\n const user = auth.user;\n const initial = (user.displayName ?? user.primaryEmail ?? '?').charAt(0).toUpperCase();\n\n return (\n <button type=\"button\" className={className ?? 'fc-btn-account'} onClick={openAccountModal}>\n {user.avatarUrl ? (\n <img src={user.avatarUrl} alt=\"\" className=\"fc-account-avatar\" />\n ) : (\n <span className=\"fc-account-avatar-placeholder\">{initial}</span>\n )}\n {!compact && (\n <span>{user.displayName ?? user.primaryEmail ?? 'Account'}</span>\n )}\n </button>\n );\n }\n\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} onClick={openModal}>\n {loginLabel ?? 'Sign in'}\n </button>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { User, AdminUser, Session, PaginatedResponse, UserStatus } from '../types';\n\nexport function useAdmin() {\n const { api, getAccessToken } = useForgeConnect();\n const [users, setUsers] = useState<PaginatedResponse<User> | null>(null);\n const [selectedUser, setSelectedUser] = useState<AdminUser | null>(null);\n const [userSessions, setUserSessions] = useState<Session[] | null>(null);\n const [loading, setLoading] = useState(false);\n\n const listUsers = useCallback(\n async (params?: { page?: number; limit?: number; search?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminListUsers(token, params);\n setUsers(data);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const getUser = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetUser(token, id);\n setSelectedUser(data);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const updateUserStatus = useCallback(\n async (id: string, status: UserStatus) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminUpdateUserStatus(token, id, status);\n // Refresh user detail if viewing same user\n if (selectedUser?.id === id) {\n await getUser(id);\n }\n },\n [api, getAccessToken, selectedUser?.id, getUser],\n );\n\n const getUserSessions = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetUserSessions(token, id);\n setUserSessions(data);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const revokeUserSessions = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminRevokeUserSessions(token, id);\n setUserSessions([]);\n },\n [api, getAccessToken],\n );\n\n return {\n users,\n selectedUser,\n userSessions,\n loading,\n listUsers,\n getUser,\n updateUserStatus,\n getUserSessions,\n revokeUserSessions,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { Role, RoleUser, UserRoleAssignment, PermissionDomains } from '../types';\n\nexport function useRoles() {\n const { api, getAccessToken } = useForgeConnect();\n const [roles, setRoles] = useState<Role[] | null>(null);\n const [selectedRole, setSelectedRole] = useState<Role | null>(null);\n const [userRoleAssignments, setUserRoleAssignments] = useState<UserRoleAssignment[] | null>(null);\n const [roleUsers, setRoleUsers] = useState<RoleUser[] | null>(null);\n const [permissionDomains, setPermissionDomains] = useState<PermissionDomains | null>(null);\n const [myPermissions, setMyPermissions] = useState<string[]>([]);\n const [loading, setLoading] = useState(false);\n\n const listRoles = useCallback(\n async (tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminListRoles(token, tenantId);\n setRoles(data.data);\n return data.data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const getRoleUsers = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const data = await api.adminGetRoleUsers(token, id);\n setRoleUsers(data.data);\n return data.data;\n },\n [api, getAccessToken],\n );\n\n const getRole = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetRole(token, id);\n setSelectedRole(data);\n // Also fetch users assigned to this role\n getRoleUsers(id).catch(() => {});\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken, getRoleUsers],\n );\n\n const createRole = useCallback(\n async (data: { name: string; description?: string; permissions: string[]; tenantId?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const role = await api.adminCreateRole(token, data);\n // Refresh list\n await listRoles(data.tenantId);\n return role;\n },\n [api, getAccessToken, listRoles],\n );\n\n const updateRole = useCallback(\n async (id: string, data: { name?: string; description?: string; permissions?: string[] }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const role = await api.adminUpdateRole(token, id, data);\n setSelectedRole(role);\n return role;\n },\n [api, getAccessToken],\n );\n\n const deleteRole = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminDeleteRole(token, id);\n if (selectedRole?.id === id) setSelectedRole(null);\n },\n [api, getAccessToken, selectedRole?.id],\n );\n\n const getPermissions = useCallback(\n async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const data = await api.adminGetPermissions(token);\n setPermissionDomains(data.domains);\n return data.domains;\n },\n [api, getAccessToken],\n );\n\n /** Get the current user's own roles (no admin privileges needed). */\n const getMyRoles = useCallback(\n async (tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.getMyRoles(token, tenantId);\n setUserRoleAssignments(data.data);\n setMyPermissions(data.permissions ?? []);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const getUserRoles = useCallback(\n async (userId: string, tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetUserRoles(token, userId, tenantId);\n setUserRoleAssignments(data.data);\n return data.data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const assignRole = useCallback(\n async (userId: string, roleId: string, tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminAssignRole(token, userId, roleId, tenantId);\n },\n [api, getAccessToken],\n );\n\n const revokeRole = useCallback(\n async (userId: string, roleId: string, tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminRevokeRole(token, userId, roleId, tenantId);\n },\n [api, getAccessToken],\n );\n\n return {\n roles,\n selectedRole,\n roleUsers,\n userRoleAssignments,\n myPermissions,\n permissionDomains,\n loading,\n listRoles,\n getRole,\n getRoleUsers,\n createRole,\n updateRole,\n deleteRole,\n getPermissions,\n getMyRoles,\n getUserRoles,\n assignRole,\n revokeRole,\n };\n}\n","/**\n * Client-side permission checking utilities.\n * These mirror the server-side logic for UI gating.\n */\n\n/** Check if a single required permission is satisfied by any of the granted permissions. */\nexport function hasPermission(required: string, granted: string[]): boolean {\n for (const g of granted) {\n if (g === '*') return true;\n if (g === required) return true;\n if (g.endsWith(':*')) {\n const gDomain = g.slice(0, -2);\n const rDomain = required.split(':')[0];\n if (gDomain === rDomain) return true;\n }\n }\n return false;\n}\n\n/** Check that ALL required permissions are satisfied. */\nexport function hasAllPermissions(required: string[], granted: string[]): boolean {\n return required.every(r => hasPermission(r, granted));\n}\n\n/** Check that at least ONE of the required permissions is satisfied. */\nexport function hasAnyPermission(required: string[], granted: string[]): boolean {\n return required.some(r => hasPermission(r, granted));\n}\n"],"mappings":";AAAA,SAAS,YAAAA,YAAU,eAAAC,cAAa,aAAAC,aAAW,UAAAC,SAAQ,WAAAC,gBAA+B;;;ACAlF,SAAS,qBAAqB;AA0EvB,IAAM,sBAAsB,cAA+C,IAAI;;;ACxE/E,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAC9B;AAAA,EACA;AAAA,EAEhB,YAAY,QAAgB,MAAc,SAAiB;AACzD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AACF;AAKA,IAAM,cAAc,oBAAI,IAA+C;AAEhE,SAAS,gBAAgB,QAAgB;AAC9C,QAAM,OAAO,OAAO,QAAQ,QAAQ,EAAE;AACtC,QAAM,SAAS,YAAY,IAAI,IAAI;AACnC,MAAI,OAAQ,QAAO;AACnB,QAAM,SAAS,eAAe,IAAI;AAClC,cAAY,IAAI,MAAM,MAAM;AAC5B,SAAO;AACT;AAEA,SAAS,eAAe,MAAc;AAEpC,QAAM,mBAAmB,oBAAI,IAA0B;AAIvD,MAAI,kBAAuC;AAE3C,iBAAe,QACb,MACA,UAII,CAAC,GACO;AACZ,UAAM,EAAE,SAAS,OAAO,MAAM,MAAM,IAAI;AAIxC,QAAI,WAAW,UAAU,SAAS,iBAAiB;AACjD,UAAI,gBAAiB,QAAO;AAC5B,wBAAkB,UAAa,MAAM,OAAO,EAAE,QAAQ,MAAM;AAC1D,0BAAkB;AAAA,MACpB,CAAC;AACD,aAAO;AAAA,IACT;AAGA,QAAI,WAAW,SAAS,OAAO;AAC7B,YAAM,WAAW,GAAG,IAAI,IAAI,KAAK;AACjC,YAAM,WAAW,iBAAiB,IAAI,QAAQ;AAC9C,UAAI,SAAU,QAAO;AACrB,YAAM,UAAU,UAAa,MAAM,OAAO,EAAE,QAAQ,MAAM;AACxD,yBAAiB,OAAO,QAAQ;AAAA,MAClC,CAAC;AACD,uBAAiB,IAAI,UAAU,OAAO;AACtC,aAAO;AAAA,IACT;AAEA,WAAO,UAAa,MAAM,OAAO;AAAA,EACnC;AAEA,iBAAe,UACb,MACA,UAII,CAAC,GACO;AACZ,UAAM,EAAE,SAAS,OAAO,MAAM,MAAM,IAAI;AACxC,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AACA,QAAI,OAAO;AACT,cAAQ,eAAe,IAAI,UAAU,KAAK;AAAA,IAC5C;AAEA,UAAM,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,IAAI;AAAA,MACxC;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,IACtC,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,UAAI;AACJ,UAAI;AACF,oBAAY,MAAM,IAAI,KAAK;AAAA,MAC7B,QAAQ;AACN,cAAM,IAAI,qBAAqB,IAAI,QAAQ,WAAW,IAAI,UAAU;AAAA,MACtE;AACA,YAAM,IAAI,qBAAqB,IAAI,QAAQ,UAAU,MAAM,MAAM,UAAU,MAAM,OAAO;AAAA,IAC1F;AAEA,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,iBAAe,eACb,MACA,SAKY;AACZ,UAAM,EAAE,SAAS,OAAO,MAAM,WAAW,IAAI;AAC7C,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,IACnB;AAEA,UAAM,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,IAAI;AAAA,MACxC;AAAA,MACA;AAAA,MACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,IACtC,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,UAAI;AACJ,UAAI;AACF,oBAAY,MAAM,IAAI,KAAK;AAAA,MAC7B,QAAQ;AACN,cAAM,IAAI,qBAAqB,IAAI,QAAQ,WAAW,IAAI,UAAU;AAAA,MACtE;AACA,YAAM,IAAI,qBAAqB,IAAI,QAAQ,UAAU,MAAM,MAAM,UAAU,MAAM,OAAO;AAAA,IAC1F;AAEA,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,SAAO;AAAA;AAAA,IAEL,SAAS,OAAe,UAAkB,aAAsB;AAC9D,aAAO,QAA2B,wBAAwB;AAAA,QACxD,QAAQ;AAAA,QACR,MAAM,EAAE,OAAO,UAAU,YAAY;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,OAAe,UAAkB;AACrC,aAAO;AAAA,QACL;AAAA,QACA,EAAE,QAAQ,QAAQ,MAAM,EAAE,OAAO,SAAS,EAAE;AAAA,MAC9C;AAAA,IACF;AAAA,IAEA,QAAQ,OAAe;AACrB,aAAO,QAA2B,yBAAyB;AAAA,QACzD,QAAQ;AAAA,QACR,MAAM,EAAE,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,IAEA,UAAU,OAAe,MAAc;AACrC,aAAO;AAAA,QACL;AAAA,QACA,EAAE,QAAQ,QAAQ,MAAM,EAAE,OAAO,KAAK,EAAE;AAAA,MAC1C;AAAA,IACF;AAAA;AAAA,IAGA,gBAAgB,eAAuB,QAAgB,UAAU;AAC/D,aAAO,QAAkD,0BAA0B;AAAA,QACjF,QAAQ;AAAA,QACR,MAAM,EAAE,eAAe,MAAM;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IAEA,aAAa,aAAqB,WAAmB,eAAuB;AAC1E,aAAO,QAAkF,uBAAuB;AAAA,QAC9G,QAAQ;AAAA,QACR,MAAM,EAAE,aAAa,WAAW,cAAc;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,IAEA,kBAAkB,eAAuB,QAAgB,UAAU;AACjE,aAAO,QAAsD,6BAA6B;AAAA,QACxF,QAAQ;AAAA,QACR,MAAM,EAAE,eAAe,MAAM;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IAEA,eAAe,aAAqB,mBAA2B,eAAuB;AACpF,aAAO,QAAkF,0BAA0B;AAAA,QACjH,QAAQ;AAAA,QACR,MAAM,EAAE,aAAa,mBAAmB,cAAc;AAAA,MACxD,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,kBAAkB,MAAc;AAC9B,aAAO,QAAmG,wBAAwB;AAAA,QAChI,QAAQ;AAAA,QACR,MAAM,EAAE,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA,IAEA,oBAAoB,OAAe;AACjC,aAAO,QAQJ,iCAAiC,mBAAmB,KAAK,CAAC,EAAE;AAAA,IACjE;AAAA,IAEA,wBAAwB,OAAe,SAAkB;AACvD,aAAO,QAKJ,iCAAiC,mBAAmB,KAAK,CAAC,YAAY;AAAA,QACvE,QAAQ;AAAA,QACR,MAAM,EAAE,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,IAEA,iBAAiB,OAAe;AAC9B,aAAO,QAAiC,2BAA2B;AAAA,QACjE,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,UAAU;AACR,aAAO,QAAiC,iBAAiB,EAAE,QAAQ,OAAO,CAAC;AAAA,IAC7E;AAAA,IAEA,OAAO,OAAe;AACpB,aAAO,QAA2B,gBAAgB,EAAE,QAAQ,QAAQ,MAAM,CAAC;AAAA,IAC7E;AAAA,IAEA,UAAU,OAAe;AACvB,aAAO,QAA2B,oBAAoB,EAAE,QAAQ,QAAQ,MAAM,CAAC;AAAA,IACjF;AAAA;AAAA,IAGA,MAAM,OAAe;AACnB,aAAO;AAAA,QACL;AAAA,QACA,EAAE,MAAM;AAAA,MACV;AAAA,IACF;AAAA,IAEA,SAAS,OAAe,MAAoD;AAC1E,aAAO;AAAA,QACL;AAAA,QACA,EAAE,QAAQ,SAAS,OAAO,MAAM,KAAK;AAAA,MACvC;AAAA,IACF;AAAA,IAEA,YAAY,OAAe,aAAqB,iBAA0B;AACxE,aAAO,QAA2B,sBAAsB;AAAA,QACtD,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,EAAE,aAAa,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC,EAAG;AAAA,MACvE,CAAC;AAAA,IACH;AAAA,IAEA,eAAe,OAAe;AAC5B,aAAO;AAAA,QACL;AAAA,QACA,EAAE,MAAM;AAAA,MACV;AAAA,IACF;AAAA,IAEA,eAAe,OAAe,MAA6J;AACzL,aAAO,QAA2B,0BAA0B;AAAA,QAC1D,QAAQ;AAAA,QACR;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IAEA,YAAY,OAAe,OAAe;AACxC,aAAO,QAA2B,mCAAmC;AAAA,QACnE,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,EAAE,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,IAEA,cAAc,OAAe,OAAe,MAAc;AACxD,aAAO,QAA2B,qCAAqC;AAAA,QACrE,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,EAAE,OAAO,KAAK;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IAEA,iBAAiB,OAAe,IAAY;AAC1C,aAAO,QAA2B,0BAA0B,EAAE,IAAI;AAAA,QAChE,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAEA,WAAW,OAAe;AACxB,aAAO;AAAA,QACL;AAAA,QACA,EAAE,MAAM;AAAA,MACV;AAAA,IACF;AAAA,IAEA,aAAa,OAAe,IAAY,MAA+C;AACrF,aAAO;AAAA,QACL,qBAAqB,EAAE;AAAA,QACvB,EAAE,QAAQ,SAAS,OAAO,MAAM,KAAK;AAAA,MACvC;AAAA,IACF;AAAA,IAEA,YAAY,OAAe;AACzB,aAAO;AAAA,QACL;AAAA,QACA,EAAE,MAAM;AAAA,MACV;AAAA,IACF;AAAA,IAEA,cAAc,OAAe,IAAY;AACvC,aAAO,QAA2B,sBAAsB,EAAE,IAAI;AAAA,QAC5D,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,iBAAiB,OAAe;AAC9B,aAAO,QAAkF,sBAAsB;AAAA,QAC7G,QAAQ;AAAA,QACR,MAAM,EAAE,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,IAEA,eAAe,OAAe;AAC5B,aAAO,QAA2B,+BAA+B;AAAA,QAC/D,QAAQ;AAAA,QACR,MAAM,EAAE,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,IAEA,cAAc,OAAe,UAAkB;AAC7C,aAAO,QAA2B,8BAA8B;AAAA,QAC9D,QAAQ;AAAA,QACR,MAAM,EAAE,OAAO,SAAS;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,aAAa,OAAe;AAC1B,aAAO,QAA8B,wBAAwB,EAAE,MAAM,CAAC;AAAA,IACxE;AAAA,IAEA,SAAS,OAAe;AACtB,aAAO,QAAmB,uBAAuB,EAAE,QAAQ,QAAQ,MAAM,CAAC;AAAA,IAC5E;AAAA,IAEA,UAAU,OAAe,MAAc;AACrC,aAAO,QAA2B,wBAAwB,EAAE,QAAQ,QAAQ,OAAO,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,IACrG;AAAA,IAEA,WAAW,OAAe,MAAc;AACtC,aAAO,QAA2B,iBAAiB,EAAE,QAAQ,UAAU,OAAO,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,IAChG;AAAA,IAEA,UAAU,gBAAwB,MAAc;AAC9C,aAAO,QAAiC,oBAAoB,EAAE,QAAQ,QAAQ,MAAM,EAAE,gBAAgB,KAAK,EAAE,CAAC;AAAA,IAChH;AAAA,IAEA,mBAAmB,gBAAwB,MAAc;AACvD,aAAO,QAAiC,6BAA6B,EAAE,QAAQ,QAAQ,MAAM,EAAE,gBAAgB,KAAK,EAAE,CAAC;AAAA,IACzH;AAAA,IAEA,wBAAwB,OAAe,MAAc;AACnD,aAAO,QAAqC,gCAAgC,EAAE,QAAQ,QAAQ,OAAO,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,IACvH;AAAA;AAAA,IAGA,YAAY,OAAe;AACzB,aAAO,QAAmB,sBAAsB,EAAE,MAAM,CAAC;AAAA,IAC3D;AAAA,IAEA,0BAA0B,OAAe,MAAe,QAAiB;AACvE,aAAO,QAAgD,mCAAmC,EAAE,QAAQ,QAAQ,OAAO,MAAM,EAAE,MAAM,OAAO,EAAE,CAAC;AAAA,IAC7I;AAAA,IAEA,0BAA0B,OAAe,cAAsB,UAAe,MAAe,MAAe,QAAiB;AAC3H,aAAO,QAAiB,kCAAkC,EAAE,QAAQ,QAAQ,OAAO,MAAM,EAAE,cAAc,UAAU,MAAM,MAAM,OAAO,EAAE,CAAC;AAAA,IAC3I;AAAA,IAEA,uBAAuB,MAAe;AACpC,aAAO,QAAgD,gCAAgC,EAAE,QAAQ,QAAQ,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,IAC3H;AAAA,IAEA,mBAAmB,cAAsB,UAAe,MAAe,QAAiB;AACtF,aAAO,QAAiC,+BAA+B,EAAE,QAAQ,QAAQ,MAAM,EAAE,cAAc,UAAU,MAAM,OAAO,EAAE,CAAC;AAAA,IAC3I;AAAA,IAEA,cAAc,OAAe,IAAY,MAAc;AACrD,aAAO,QAAiB,sBAAsB,EAAE,IAAI,EAAE,QAAQ,SAAS,OAAO,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,IAChG;AAAA,IAEA,cAAc,OAAe,IAAY;AACvC,aAAO,QAA2B,sBAAsB,EAAE,IAAI,EAAE,QAAQ,UAAU,MAAM,CAAC;AAAA,IAC3F;AAAA;AAAA,IAGA,uBAAuB,OAAe;AACpC,aAAO,QAA2C,4BAA4B;AAAA,QAC5E,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAEA,uBAAuB,OAAe,MAAe;AACnD,aAAO,QAA2B,4BAA4B;AAAA,QAC5D,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,eAAe,OAAe,QAA6D;AACzF,YAAM,QAAQ,IAAI,gBAAgB;AAClC,UAAI,QAAQ,KAAM,OAAM,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACvD,UAAI,QAAQ,MAAO,OAAM,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAC1D,UAAI,QAAQ,OAAQ,OAAM,IAAI,UAAU,OAAO,MAAM;AACrD,YAAM,KAAK,MAAM,SAAS;AAC1B,aAAO,QAAiC,eAAe,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC;AAAA,IACxF;AAAA,IAEA,aAAa,OAAe,IAAY;AACtC,aAAO,QAAmB,gBAAgB,EAAE,IAAI,EAAE,MAAM,CAAC;AAAA,IAC3D;AAAA,IAEA,sBAAsB,OAAe,IAAY,QAAoB;AACnE,aAAO,QAA2B,gBAAgB,EAAE,WAAW;AAAA,QAC7D,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,EAAE,OAAO;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,IAEA,qBAAqB,OAAe,IAAY;AAC9C,aAAO,QAAmB,gBAAgB,EAAE,aAAa,EAAE,MAAM,CAAC;AAAA,IACpE;AAAA,IAEA,wBAAwB,OAAe,IAAY;AACjD,aAAO,QAA2B,gBAAgB,EAAE,aAAa;AAAA,QAC/D,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,eAAe,OAAe,UAAmB;AAC/C,YAAM,QAAQ,IAAI,gBAAgB;AAClC,UAAI,SAAU,OAAM,IAAI,YAAY,QAAQ;AAC5C,YAAM,KAAK,MAAM,SAAS;AAC1B,aAAO,QAA0B,eAAe,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC;AAAA,IACjF;AAAA,IAEA,aAAa,OAAe,IAAY;AACtC,aAAO,QAAc,gBAAgB,EAAE,IAAI,EAAE,MAAM,CAAC;AAAA,IACtD;AAAA,IAEA,kBAAkB,OAAe,IAAY;AAC3C,aAAO,QAA8B,gBAAgB,EAAE,UAAU,EAAE,MAAM,CAAC;AAAA,IAC5E;AAAA,IAEA,gBAAgB,OAAe,MAAwF;AACrH,aAAO,QAAc,gBAAgB,EAAE,QAAQ,QAAQ,OAAO,MAAM,KAAK,CAAC;AAAA,IAC5E;AAAA,IAEA,gBAAgB,OAAe,IAAY,MAAuE;AAChH,aAAO,QAAc,gBAAgB,EAAE,IAAI,EAAE,QAAQ,SAAS,OAAO,MAAM,KAAK,CAAC;AAAA,IACnF;AAAA,IAEA,gBAAgB,OAAe,IAAY;AACzC,aAAO,QAA2B,gBAAgB,EAAE,IAAI,EAAE,QAAQ,UAAU,MAAM,CAAC;AAAA,IACrF;AAAA,IAEA,oBAAoB,OAAe;AACjC,aAAO,QAAwC,4BAA4B,EAAE,MAAM,CAAC;AAAA,IACtF;AAAA;AAAA,IAGA,WAAW,OAAe,UAAmB;AAC3C,YAAM,QAAQ,IAAI,gBAAgB;AAClC,UAAI,SAAU,OAAM,IAAI,YAAY,QAAQ;AAC5C,YAAM,KAAK,MAAM,SAAS;AAC1B,aAAO,QAA+D,kBAAkB,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC;AAAA,IACzH;AAAA,IAEA,kBAAkB,OAAe,QAAgB,UAAmB;AAClE,YAAM,QAAQ,IAAI,gBAAgB;AAClC,UAAI,SAAU,OAAM,IAAI,YAAY,QAAQ;AAC5C,YAAM,KAAK,MAAM,SAAS;AAC1B,aAAO,QAAwC,gBAAgB,MAAM,SAAS,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC;AAAA,IAC/G;AAAA,IAEA,gBAAgB,OAAe,QAAgB,QAAgB,UAAmB;AAChF,aAAO,QAA2B,gBAAgB,MAAM,UAAU;AAAA,QAChE,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,EAAE,QAAQ,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC,EAAG;AAAA,MACpD,CAAC;AAAA,IACH;AAAA,IAEA,gBAAgB,OAAe,QAAgB,QAAgB,UAAmB;AAChF,YAAM,QAAQ,IAAI,gBAAgB;AAClC,UAAI,SAAU,OAAM,IAAI,YAAY,QAAQ;AAC5C,YAAM,KAAK,MAAM,SAAS;AAC1B,aAAO,QAA2B,gBAAgB,MAAM,UAAU,MAAM,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI;AAAA,QAC/F,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,mBAAmB,YAAoB,aAAqB,UAAmB;AAC7E,aAAO,eAAwC,yBAAyB;AAAA,QACtE,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,EAAE,OAAO,aAAa,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC,EAAG;AAAA,MAChE,CAAC;AAAA,IACH;AAAA,IAEA,oBAAoB,YAAoB,eAAuB,OAAgB;AAC7E,aAAO,eAAiC,2BAA2B;AAAA,QACjE,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,EAAE,eAAe,MAAM;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AC/hBO,SAAS,UAAU,OAAkC;AAC1D,MAAI;AACF,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,UAAU,KAAK,MAAM,KAAK,MAAM,CAAC,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG,CAAC,CAAC;AAC/E,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,gBAAgB,OAA8B;AAC5D,QAAM,UAAU,UAAU,KAAK;AAC/B,MAAI,CAAC,SAAS,OAAO,CAAC,QAAQ,IAAK,QAAO;AAC1C,QAAM,OAAO,QAAQ,MAAM,QAAQ,OAAO;AAC1C,QAAM,UAAU,KAAK,IAAI,IAAI,QAAQ,MAAM;AAC3C,QAAM,QAAQ,MAAM,MAAM;AAC1B,SAAO,QAAQ,IAAI,QAAQ;AAC7B;;;AC9BA,SAAS,YAAAC,iBAAgC;;;ACAzC,SAAS,kBAAkB;AAGpB,SAAS,kBAA4C;AAC1D,QAAM,MAAM,WAAW,mBAAmB;AAC1C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AACA,SAAO;AACT;;;ACTA,SAAS,WAAW,cAA8B;AAClD,SAAS,oBAAoB;AAmCvB,SAGM,KAHN;AA3BC,SAAS,aAAa,EAAE,QAAQ,SAAS,SAAS,GAAsB;AAC7E,QAAM,aAAa,OAAuB,IAAI;AAE9C,YAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,gBAAgB,CAAC,MAAqB;AAC1C,UAAI,EAAE,QAAQ,SAAU,SAAQ;AAAA,IAClC;AACA,aAAS,iBAAiB,WAAW,aAAa;AAClD,aAAS,KAAK,MAAM,WAAW;AAC/B,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,aAAa;AAErD,UAAI,CAAC,SAAS,cAAc,aAAa,GAAG;AAC1C,iBAAS,KAAK,MAAM,WAAW;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpB,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,sBAAsB,CAAC,MAAwB;AACnD,QAAI,EAAE,WAAW,WAAW,QAAS,SAAQ;AAAA,EAC/C;AAEA,SAAO;AAAA,IACL,oBAAC,SAAI,WAAU,cAAa,KAAK,YAAY,SAAS,qBACpD,+BAAC,SAAI,WAAU,YAAW,MAAK,UAAS,cAAW,QACjD;AAAA,0BAAC,YAAO,WAAU,kBAAiB,SAAS,SAAS,cAAW,SAC9D,8BAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,8BAAC,UAAK,GAAE,wBAAuB,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,GAC7F,GACF;AAAA,MACC;AAAA,OACH,GACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;AC/CA,SAAS,gBAAgC;;;ACEzC,IAAM,kBAAuC,oBAAI,IAAI,CAAC,UAAU,WAAW,WAAW,SAAS,YAAY,SAAS,CAAC;AAG9G,SAAS,cAAc,QAA8C;AAC1E,SAAO,gBAAgB,IAAI,MAAM;AACnC;AAOO,SAAS,oBAAoB,QAA2C;AAC7E,MAAI,OAAO,gBAAgB,OAAO,aAAa,SAAS,GAAG;AACzD,WAAO,OAAO;AAAA,EAChB;AAGA,QAAM,UAAyB,CAAC;AAEhC,MAAI,OAAO,gBAAgB;AACzB,eAAW,KAAK,OAAO,gBAAgB;AACrC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,UAAQ,KAAK,OAAO;AAEpB,MAAI,OAAO,sBAAsB,OAAO;AACtC,YAAQ,KAAK,KAAK;AAAA,EACpB;AAEA,MAAI,OAAO,gBAAgB,OAAO;AAChC,YAAQ,KAAK,QAAQ;AAAA,EACvB;AAEA,SAAO;AACT;AAGO,SAAS,kBAAkB,QAAgC;AAChE,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAW,aAAO;AAAA;AAAA,IACvB;AAAS,aAAO;AAAA,EAClB;AACF;AAQO,SAAS,mBAAmB,QAA4B,SAAmC;AAEhG,MAAI,QAAQ,WAAW,KAAK,CAAC,cAAc,QAAQ,CAAC,CAAC,GAAG;AACtD,WAAO,kBAAkB,QAAQ,CAAC,CAAC;AAAA,EACrC;AAEA,QAAM,gBAAgB,OAAO;AAC7B,MAAI,CAAC,iBAAiB,CAAC,QAAQ,SAAS,aAAa,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,aAAa,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,kBAAkB,aAAa;AACxC;;;AD9CM,gBAAAC,MAEE,QAAAC,aAFF;AAxBC,SAAS,iBAAiB;AAC/B,QAAM,EAAE,gBAAgB,cAAc,OAAO,IAAI,gBAAgB;AACjE,QAAM,UAAU,oBAAoB,MAAM;AAC1C,QAAM,WAAW,QAAQ,SAAS;AAClC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,eAAe,OAAO,MAAiB;AAC3C,MAAE,eAAe;AACjB,aAAS,EAAE;AACX,eAAW,IAAI;AACf,QAAI;AACF,YAAM,eAAe,OAAO,QAAQ;AAAA,IACtC,SAAS,KAAc;AACrB,eAAS,eAAe,QAAQ,IAAI,UAAU,yCAAyC;AAAA,IACzF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,gBAAAA,MAAC,SAAI,WAAU,UACb;AAAA,oBAAAD,KAAC,QAAG,WAAU,gBAAe,gCAAkB;AAAA,IAC/C,gBAAAC,MAAC,UAAK,UAAU,cAAc,WAAU,WACtC;AAAA,sBAAAA,MAAC,WAAM,WAAU,YAAW;AAAA;AAAA,QAE1B,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC,aAAY;AAAA,YACZ,UAAQ;AAAA,YACR,cAAa;AAAA;AAAA,QACf;AAAA,SACF;AAAA,MACA,gBAAAC,MAAC,WAAM,WAAU,YAAW;AAAA;AAAA,QAE1B,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,YAC3C,aAAY;AAAA,YACZ,UAAQ;AAAA,YACR,cAAa;AAAA,YACb,WAAW;AAAA;AAAA,QACb;AAAA,SACF;AAAA,MACC,SAAS,gBAAAA,KAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,MACzC,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,UAAU,SAC/D,oBAAU,kBAAkB,WAC/B;AAAA,OACF;AAAA,IACA,gBAAAA,KAAC,OAAE,WAAU,aACX,0BAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM,aAAa,iBAAiB,GAAG,8BAE1F,GACF;AAAA,IACA,gBAAAC,MAAC,OAAE,WAAU,aAAY;AAAA;AAAA,MACA;AAAA,MACvB,gBAAAD,KAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM,aAAa,gBAAgB,GAAG,qBAEzF;AAAA,OACF;AAAA,IACC,YACC,gBAAAA,KAAC,OAAE,WAAU,aACX,0BAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM,aAAa,eAAe,GAAG,kBAExF,GACF;AAAA,KAEJ;AAEJ;AAEO,SAAS,oBAAoB;AAClC,QAAM,EAAE,UAAU,aAAa,IAAI,gBAAgB;AACnD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,eAAe,OAAO,MAAiB;AAC3C,MAAE,eAAe;AACjB,aAAS,EAAE;AACX,eAAW,IAAI;AACf,QAAI;AACF,YAAM,SAAS,OAAO,UAAU,eAAe,MAAS;AACxD,iBAAW,IAAI;AAAA,IACjB,SAAS,KAAc;AACrB,eAAS,eAAe,QAAQ,IAAI,UAAU,yCAAyC;AAAA,IACzF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,SAAS;AACX,WACE,gBAAAC,MAAC,SAAI,WAAU,UACb;AAAA,sBAAAD,KAAC,QAAG,WAAU,gBAAe,8BAAgB;AAAA,MAC7C,gBAAAC,MAAC,OAAE,WAAU,WAAU;AAAA;AAAA,QAA+B,gBAAAD,KAAC,YAAQ,iBAAM;AAAA,QAAS;AAAA,SAAkD;AAAA,MAChI,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,MAAM,aAAa,aAAa,GAAG,6BAEtG;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,MAAC,SAAI,WAAU,UACb;AAAA,oBAAAD,KAAC,QAAG,WAAU,gBAAe,+BAAiB;AAAA,IAC9C,gBAAAC,MAAC,UAAK,UAAU,cAAc,WAAU,WACtC;AAAA,sBAAAA,MAAC,WAAM,WAAU,YAAW;AAAA;AAAA,QAE1B,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,YAC9C,aAAY;AAAA,YACZ,cAAa;AAAA;AAAA,QACf;AAAA,SACF;AAAA,MACA,gBAAAC,MAAC,WAAM,WAAU,YAAW;AAAA;AAAA,QAE1B,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC,aAAY;AAAA,YACZ,UAAQ;AAAA,YACR,cAAa;AAAA;AAAA,QACf;AAAA,SACF;AAAA,MACA,gBAAAC,MAAC,WAAM,WAAU,YAAW;AAAA;AAAA,QAE1B,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,YAC3C,aAAY;AAAA,YACZ,UAAQ;AAAA,YACR,cAAa;AAAA,YACb,WAAW;AAAA;AAAA,QACb;AAAA,SACF;AAAA,MACC,SAAS,gBAAAA,KAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,MACzC,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,UAAU,SAC/D,oBAAU,wBAAwB,kBACrC;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,OAAE,WAAU,aAAY;AAAA;AAAA,MACE;AAAA,MACzB,gBAAAD,KAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM,aAAa,aAAa,GAAG,qBAEtF;AAAA,OACF;AAAA,KACF;AAEJ;;;AE1KA,SAAS,YAAAE,WAAU,UAAAC,eAAuE;AAiFlF,gBAAAC,MAEE,QAAAC,aAFF;AA7ED,SAAS,eAAe;AAC7B,QAAM,EAAE,SAAS,WAAW,cAAc,OAAO,IAAI,gBAAgB;AACrE,QAAM,UAAU,oBAAoB,MAAM;AAC1C,QAAM,WAAW,QAAQ,SAAS;AAClC,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AACzD,QAAM,CAAC,MAAM,OAAO,IAAIA,UAA2B,OAAO;AAC1D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,YAAYC,QAAoC,CAAC,CAAC;AAExD,QAAM,iBAAiB,OAAO,MAAiB;AAC7C,MAAE,eAAe;AACjB,aAAS,EAAE;AACX,eAAW,IAAI;AACf,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,cAAQ,MAAM;AAAA,IAChB,SAAS,KAAc;AACrB,eAAS,eAAe,QAAQ,IAAI,UAAU,4CAA4C;AAAA,IAC5F,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,WAAqB;AAC/C,UAAM,UAAU,OAAO,KAAK,EAAE;AAC9B,QAAI,QAAQ,WAAW,EAAG;AAC1B,aAAS,EAAE;AACX,eAAW,IAAI;AACf,QAAI;AACF,YAAM,UAAU,OAAO,OAAO;AAAA,IAChC,SAAS,KAAc;AACrB,eAAS,eAAe,QAAQ,IAAI,UAAU,qDAAqD;AACnG,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,OAAe,UAAkB;AAC1D,QAAI,CAAC,QAAQ,KAAK,KAAK,EAAG;AAC1B,UAAM,QAAQ,MAAM,MAAM,EAAE;AAC5B,UAAM,UAAU,CAAC,GAAG,IAAI;AACxB,YAAQ,KAAK,IAAI;AACjB,YAAQ,OAAO;AAEf,QAAI,SAAS,QAAQ,GAAG;AACtB,gBAAU,QAAQ,QAAQ,CAAC,GAAG,MAAM;AAAA,IACtC;AAEA,QAAI,QAAQ,MAAM,CAAC,MAAM,MAAM,EAAE,GAAG;AAClC,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,OAAe,MAAuC;AAC3E,QAAI,EAAE,QAAQ,eAAe,CAAC,KAAK,KAAK,KAAK,QAAQ,GAAG;AACtD,gBAAU,QAAQ,QAAQ,CAAC,GAAG,MAAM;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,MAAwC;AAC3D,MAAE,eAAe;AACjB,UAAM,SAAS,EAAE,cAAc,QAAQ,MAAM,EAAE,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,CAAC;AAC5E,QAAI,CAAC,OAAQ;AACb,UAAM,UAAU,CAAC,GAAG,IAAI;AACxB,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAQ,CAAC,IAAI,OAAO,CAAC;AAAA,IACvB;AACA,YAAQ,OAAO;AACf,QAAI,QAAQ,MAAM,CAAC,MAAM,MAAM,EAAE,GAAG;AAClC,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,SAAS,SAAS;AACpB,WACE,gBAAAF,MAAC,SAAI,WAAU,UACb;AAAA,sBAAAD,KAAC,QAAG,WAAU,gBAAe,kCAAoB;AAAA,MACjD,gBAAAC,MAAC,UAAK,UAAU,gBAAgB,WAAU,WACxC;AAAA,wBAAAA,MAAC,WAAM,WAAU,YAAW;AAAA;AAAA,UAE1B,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,cACxC,aAAY;AAAA,cACZ,UAAQ;AAAA,cACR,cAAa;AAAA;AAAA,UACf;AAAA,WACF;AAAA,QACC,SAAS,gBAAAA,KAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,QACzC,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,UAAU,SAC/D,oBAAU,eAAe,aAC5B;AAAA,SACF;AAAA,MACC,YACC,gBAAAA,KAAC,OAAE,WAAU,aACX,0BAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM,aAAa,eAAe,GAAG,kBAExF,GACF;AAAA,OAEJ;AAAA,EAEJ;AAEA,SACE,gBAAAC,MAAC,SAAI,WAAU,UACb;AAAA,oBAAAD,KAAC,QAAG,WAAU,gBAAe,qCAAuB;AAAA,IACpD,gBAAAC,MAAC,OAAE,WAAU,WAAU;AAAA;AAAA,MAA0B,gBAAAD,KAAC,YAAQ,iBAAM;AAAA,OAAS;AAAA,IACzE,gBAAAA,KAAC,SAAI,WAAU,iBACZ,eAAK,IAAI,CAAC,OAAO,MAChB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,KAAK,CAAC,OAAO;AAAE,oBAAU,QAAQ,CAAC,IAAI;AAAA,QAAI;AAAA,QAC1C,MAAK;AAAA,QACL,WAAU;AAAA,QACV,WAAW;AAAA,QACX,WAAU;AAAA,QACV,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,kBAAkB,GAAG,EAAE,OAAO,KAAK;AAAA,QACpD,WAAW,CAAC,MAAM,cAAc,GAAG,CAAC;AAAA,QACpC,SAAS,MAAM,IAAI,cAAc;AAAA,QACjC,WAAW,MAAM;AAAA;AAAA,MAVZ;AAAA,IAWP,CACD,GACH;AAAA,IACC,SAAS,gBAAAA,KAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,IACxC,WAAW,gBAAAA,KAAC,OAAE,WAAU,WAAU,0BAAY;AAAA,IAC/C,gBAAAA,KAAC,OAAE,WAAU,aACX,0BAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM;AAAE,cAAQ,OAAO;AAAG,cAAQ,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AAAG,eAAS,EAAE;AAAA,IAAG,GAAG,mCAEjI,GACF;AAAA,KACF;AAEJ;;;AC7IA,SAAS,YAAAI,WAAU,SAAoB,UAAAC,SAAQ,mBAAmB;;;ACAlE,SAAS,UAAAC,SAAQ,aAAAC,kBAAiB;AA8CzB,gBAAAC,YAAA;AAtCF,SAAS,QAAQ,EAAE,KAAK,UAAU,GAAwC;AAC/E,QAAM,MAAMF,QAAwB,IAAI;AAExC,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,IAAI,WAAW,CAAC,IAAK;AAE1B,QAAI;AAGF,YAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,KAAK,WAAW;AAC5D,YAAM,QAAQ,IAAI,KAAK,cAAc,KAAK;AAE1C,UAAI,CAAC,OAAO;AACV,YAAI,QAAQ,cAAc;AAC1B;AAAA,MACF;AAGA,YAAM,YAAY,MAAM,iBAAiB,0CAA0C;AACnF,gBAAU,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;AAGrC,YAAM,MAAM,MAAM,iBAAiB,GAAG;AACtC,UAAI,QAAQ,CAAC,OAAO;AAClB,mBAAW,QAAQ,MAAM,KAAK,GAAG,UAAU,GAAG;AAC5C,cAAI,KAAK,KAAK,WAAW,IAAI,GAAG;AAC9B,eAAG,gBAAgB,KAAK,IAAI;AAAA,UAC9B;AAAA,QACF;AAAA,MACF,CAAC;AAED,UAAI,QAAQ,cAAc;AAC1B,UAAI,QAAQ,YAAY,KAAK;AAAA,IAC/B,QAAQ;AACN,UAAI,QAAQ,cAAc;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,SAAO,gBAAAC,KAAC,UAAK,KAAU,WAAsB;AAC/C;;;ACTI,SAKE,OAAAC,MALF,QAAAC,aAAA;AAjCG,IAAM,gBAAwE;AAAA,EACnF,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACF;AAGO,SAAS,YAAY,EAAE,SAAS,GAAgC;AACrE,QAAM,EAAE,eAAe,IAAI,gBAAgB;AAC3C,QAAM,OAAO,cAAc,QAAQ;AAEnC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,SAAS,MAAM,eAAe,QAAQ;AAAA,MAEtC;AAAA,wBAAAD,KAAC,WAAQ,KAAK,KAAK,MAAM,WAAU,iBAAgB;AAAA,QACnD,gBAAAA,KAAC,UAAK,WAAU,eAAe,eAAK,OAAM;AAAA;AAAA;AAAA,EAC5C;AAEJ;;;AFnCI,SAwQQ,UAnQN,OAAAE,MALF,QAAAC,aAAA;AAJJ,SAAS,qBAAqB;AAC5B,QAAM,EAAE,eAAe,IAAI,gBAAgB;AAC3C,QAAM,OAAO,cAAc;AAC3B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,SAAS,MAAM,eAAe,SAAS;AAAA,MAEvC;AAAA,wBAAAD,KAAC,WAAQ,KAAK,KAAK,MAAM,WAAU,iBAAgB;AAAA,QACnD,gBAAAA,KAAC,UAAK,WAAU,kBAAkB,eAAK,OAAM;AAAA,QAC7C,gBAAAA,KAAC,UAAK,WAAU,sBAAqB,4BAAc;AAAA;AAAA;AAAA,EACrD;AAEJ;AAWO,IAAM,iBAAiC;AAAA,EAC5C;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,iCAAiC,mBAAmB,GAAG,CAAC,QAAQ,mBAAmB,GAAG,CAAC;AAAA,EAC5G;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,qCAAqC,mBAAmB,GAAG,CAAC,QAAQ,mBAAmB,GAAG,CAAC;AAAA,EAChH;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,kCAAkC,mBAAmB,GAAG,CAAC;AAAA,EAC9E;AACF;AAEO,SAAS,WAAoB;AAClC,MAAI,OAAO,cAAc,YAAa,QAAO;AAC7C,SAAO,iEAAiE,KAAK,UAAU,SAAS;AAClG;AAEO,SAAS,oBAAoB;AAClC,QAAM,EAAE,eAAe,cAAc,OAAO,IAAI,gBAAgB;AAChE,QAAM,UAAU,oBAAoB,MAAM;AAC1C,QAAM,WAAW,QAAQ,SAAS;AAGlC,MAAI,CAAC,iBAAiB,SAAS,GAAG;AAChC,WAAO,gBAAAA,KAAC,oBAAiB;AAAA,EAC3B;AAEA,MAAI,eAAe;AACjB,WAAO,gBAAAA,KAAC,qBAAkB;AAAA,EAC5B;AAEA,SACE,gBAAAC,MAAC,SAAI,WAAU,UACb;AAAA,oBAAAD,KAAC,QAAG,WAAU,gBAAe,4BAAc;AAAA,IAC3C,gBAAAC,MAAC,OAAE,WAAU,WAAU;AAAA;AAAA,MACY,gBAAAD,KAAC,UAAK,2BAAa;AAAA,MAAO;AAAA,MAAI;AAAA,MAC/D,gBAAAA,KAAC,UAAK,oCAA4B;AAAA,MAAO;AAAA,OAC3C;AAAA,IACC,YACC,gBAAAA,KAAC,OAAE,WAAU,aACX,0BAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM,aAAa,eAAe,GAAG,kBAExF,GACF;AAAA,KAEJ;AAEJ;AAGA,SAAS,mBAAmB;AAC1B,QAAM,EAAE,cAAc,OAAO,IAAI,gBAAgB;AACjD,QAAM,UAAU,oBAAoB,MAAM;AAC1C,QAAM,WAAW,QAAQ,SAAS;AAClC,QAAM,eAAe,OAAO;AAC5B,QAAM,YAAY,cAAc,oBAAoB,CAAC;AACrD,QAAM,gBAAgB,cAAc,iBAAiB;AAErD,QAAM,gBAAgB,QAAQ,MAAM;AAClC,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,WAAW,UACd,IAAI,CAAC,SAAS,eAAe,KAAK,CAAC,OAAO,GAAG,SAAS,IAAI,CAAC,EAC3D,OAAO,OAAO;AACjB,UAAI,cAAe,QAAO;AAC1B,YAAM,YAAY,IAAI,IAAI,SAAS;AACnC,YAAM,SAAS,eAAe,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG,IAAI,CAAC;AACpE,aAAO,CAAC,GAAG,UAAU,GAAG,MAAM;AAAA,IAChC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,aAAa,CAAC;AAE7B,QAAM,aAAa,CAAC,OAAqB;AACvC,UAAM,UAAU,OAAO,SAAS;AAChC,WAAO,SAAS,OAAO,GAAG,SAAS,OAAO;AAAA,EAC5C;AAEA,QAAM,cAAc,QAAQ,SAAS,SAAS;AAE9C,SACE,gBAAAC,MAAC,SAAI,WAAU,UACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,kBACZ;AAAA,qBAAe,gBAAAD,KAAC,sBAAmB;AAAA,MACnC,cAAc,IAAI,CAAC,OAClB,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM,WAAW,EAAE;AAAA,UAE5B;AAAA,4BAAAD,KAAC,UAAK,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GAC1D,0BAAAA,KAAC,SAAI,KAAK,GAAG,MAAM,KAAI,IAAG,WAAU,kBAAiB,GACvD;AAAA,YACA,gBAAAA,KAAC,UAAK,WAAU,kBAAkB,aAAG,MAAK;AAAA,YAC1C,gBAAAA,KAAC,UAAK,WAAU,sBAAqB,sBAAQ;AAAA;AAAA;AAAA,QATxC,GAAG;AAAA,MAUV,CACD;AAAA,OACH;AAAA,IACA,gBAAAA,KAAC,OAAE,WAAU,WAAU,OAAO,EAAE,WAAW,UAAU,UAAU,IAAI,SAAS,IAAI,GAAG,gEAEnF;AAAA,IACC,YACC,gBAAAA,KAAC,OAAE,WAAU,aACX,0BAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM,aAAa,eAAe,GAAG,kBAExF,GACF;AAAA,KAEJ;AAEJ;AAEA,SAAS,oBAAoB;AAC3B,QAAM,EAAE,eAAe,iBAAiB,cAAc,OAAO,IAAI,gBAAgB;AACjF,QAAM,SAAS;AACf,QAAM,eAAe,OAAO;AAC5B,QAAM,UAAU,oBAAoB,MAAM;AAC1C,QAAM,WAAW,QAAQ,SAAS;AAClC,QAAM,CAAC,OAAO,QAAQ,IAAIE,UAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,SAAS,QAAQ,MAAM,SAAS,GAAG,CAAC,CAAC;AAE3C,QAAM,gBAAgBC,QAAO,UAAU;AACvC,gBAAc,UAAU;AAGxB,QAAM,0BAA0B,YAAY,CAAC,YAAsE;AACjH,QAAI,CAAC,QAAQ,gBAAiB,QAAO;AACrC,UAAM,UAAU,cAAc;AAC9B,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,OAAO,aAAqB;AACjC,YAAM,QAAQ,WAAW,KAAK,KAAK,QAAQ,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACpE,YAAM,KAAK,QAAQ,KAAK,KAAK;AAC7B,YAAM,WAAW,MAAM,QAAQ,gBAAgB,EAAE;AACjD,aAAO,KAAK,OAAO,aAAa,GAAG,IAAI,WAAW,SAAS,UAAU,CAAC,CAAC,CAAC;AAAA,IAC1E;AAAA,EACF,GAAG,CAAC,cAAc,WAAW,CAAC;AAG9B,QAAM,gBAAgB,OAAO,MAAkC;AAC7D,QAAI,EAAE,eAAe,aAAa;AAChC,UAAI,QAAQ;AACV,cAAM,KAAK,eAAe,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,IAAI;AAC/D,YAAI,IAAI;AACN,iBAAO,SAAS,OAAO,GAAG,SAAS,OAAO,SAAS,IAAI;AACvD;AAAA,QACF;AAAA,MACF;AACA,YAAM,MAAO,EAAE,QAAgB;AAC/B,UAAI,IAAK,QAAO,KAAK,KAAK,QAAQ;AAClC;AAAA,IACF;AAEA,aAAS,EAAE;AACX,eAAW,IAAI;AAEf,QAAI;AAEF,aAAO,OAAO,EAAE,QAAQ,IAAI;AAG5B,UAAI,CAAC,EAAE,QAAQ,WAAW;AACxB,cAAO,EAAE,QAAgB,QAAQ;AAAA,MACnC;AAGA,YAAM,KAAK,EAAE,QAAQ;AACrB,UAAI,CAAC,GAAI,OAAM,IAAI,MAAM,sCAAsC;AAG/D,YAAM,UAAkB,GAAG,SAAS;AACpC,YAAM,UAAU,cAAc;AAC9B,YAAM,qBAAsB,EAAE,QAAgB,cAC1C,CAAC,QAAqB,EAAE,QAAgB,YAAY,GAAG,IACvD;AAEJ,YAAM;AAAA,QACJ;AAAA,QACA,UAAU,SAAY;AAAA,QACtB;AAAA,QACA,UAAU,wBAAwB,EAAE,OAAO,IAAI;AAAA,MACjD;AAAA,IACF,SAAS,KAAc;AACrB,eAAS,eAAe,QAAQ,IAAI,UAAU,iDAAiD;AAC/F,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,mBAAmB,CAAC,OAAqB;AAC7C,WAAO,SAAS,OAAO,GAAG,SAAS,OAAO,SAAS,IAAI;AAAA,EACzD;AAEA,QAAM,YAAY,cAAc,oBAAoB,CAAC;AACrD,QAAM,gBAAgB,cAAc,iBAAiB;AACrD,QAAM,eAAe,IAAI,IAAI,SAAS;AAEtC,QAAM,sBAAsB,OAAO,YAC/B,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,SAAS,GAAG,QAAQ,QAAQ,OACjE;AAEJ,QAAM,EAAE,kBAAkB,aAAa,IAAI,QAAQ,MAAM;AACvD,UAAM,MAAM,OAAO;AAEnB,UAAM,WAAW,UACd,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,QAAQ,SAAS,IAAI,CAAC,EACtD,OAAO,OAAO;AAEjB,QAAI,iBAAiB,UAAU,SAAS,GAAG;AACzC,aAAO,EAAE,kBAAkB,UAAU,cAAc,CAAC,EAAgB;AAAA,IACtE;AAEA,UAAM,SAAS,IAAI;AAAA,MACjB,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,QAAQ,IAAI,KAAK,EAAE,eAAe;AAAA,IAC/D;AAEA,WAAO,EAAE,kBAAkB,UAAU,cAAc,OAAO;AAAA,EAC5D,GAAG,CAAC,OAAO,SAAS,YAAY,CAAC;AAGjC,QAAM,qBAAqB,QAAQ,MAAM;AACvC,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,UAAM,eAAe,IAAI,IAAI,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC;AACtE,WAAO,eAAe,OAAO,CAAC,OAAO,CAAC,aAAa,IAAI,GAAG,IAAI,CAAC;AAAA,EACjE,GAAG,CAAC,QAAQ,OAAO,OAAO,CAAC;AAE3B,SACE,gBAAAF,MAAC,SAAI,WAAU,UACZ;AAAA,cACC,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,SAAS,GACnD;AAAA,sBAAAD,KAAC,OAAE,WAAU,gBAAe,2BAAa;AAAA,MACzC,gBAAAA,KAAC,OAAE,WAAU,WACV,uBACG,2CACA,6EACN;AAAA,MACC,SACC,gBAAAC,MAAA,YACE;AAAA,wBAAAD,KAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,QAC/B,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM;AAAE,yBAAW,KAAK;AAAG,uBAAS,EAAE;AAAA,YAAG;AAAA,YAClD,OAAO,EAAE,WAAW,EAAE;AAAA,YACvB;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OAEJ,IAEA,gBAAAC,MAAA,YACE;AAAA,sBAAAA,MAAC,SAAI,WAAU,kBACZ;AAAA,gBAAQ,SAAS,SAAS,KAAK,gBAAAD,KAAC,sBAAmB;AAAA,QACnD,iBAAiB,IAAI,CAAC,MAAM;AAC3B,gBAAM,YAAY,EAAE,eAAe;AACnC,gBAAM,cAAc,EAAE,QAAQ,SAAS;AACvC,iBACE,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM,cAAc,CAAC;AAAA,cAE9B;AAAA,gCAAAD,KAAC,UAAK,WAAW,YAAY,qBAAqB,IAAI,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GAC1G,0BAAAA,KAAC,SAAI,KAAK,EAAE,QAAQ,MAAM,KAAI,IAAG,WAAU,kBAAiB,GAC9D;AAAA,gBACA,gBAAAA,KAAC,UAAK,WAAU,kBAAkB,YAAE,QAAQ,MAAK;AAAA,gBAChD,cACG,gBAAAA,KAAC,UAAK,WAAU,sBAAqB,uBAAS,IAC9C,gBAAAA,KAAC,UAAK,WAAU,sBAAqB,uBAAS;AAAA,gBAEjD,CAAC,aAAa,UAAU,eAAe,KAAK,CAAC,OAAO,GAAG,SAAS,EAAE,QAAQ,IAAI,IAC3E,gBAAAA,KAAC,UAAK,WAAU,oBAAmB,sBAAQ,IAC3C,CAAC,aAAa,gBAAAA,KAAC,UAAK,WAAU,oBAAmB,qBAAO;AAAA;AAAA;AAAA,YAfvD,EAAE,QAAQ;AAAA,UAiBjB;AAAA,QAEJ,CAAC;AAAA,QAGA,mBAAmB,IAAI,CAAC,OACvB,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,iBAAiB,EAAE;AAAA,YAElC;AAAA,8BAAAD,KAAC,UAAK,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GAC1D,0BAAAA,KAAC,SAAI,KAAK,GAAG,MAAM,KAAI,IAAG,WAAU,kBAAiB,GACvD;AAAA,cACA,gBAAAA,KAAC,UAAK,WAAU,kBAAkB,aAAG,MAAK;AAAA,cAC1C,gBAAAA,KAAC,UAAK,WAAU,oBAAmB,sBAAQ;AAAA;AAAA;AAAA,UATtC,GAAG;AAAA,QAUV,CACD;AAAA,QAEA,aAAa,SAAS,KAAK,CAAC,aAC3B,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,aAAa,IAAI;AAAA,YAEhC;AAAA,8BAAAD,KAAC,UAAK,WAAU,yBACd,0BAAAC,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD;AAAA,gCAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,gBACxF,gBAAAA,KAAC,UAAK,GAAE,WAAU,QAAO,gBAAe,aAAY,OAAM;AAAA,gBAC1D,gBAAAA,KAAC,UAAK,GAAE,MAAK,GAAE,MAAK,OAAM,KAAI,QAAO,KAAI,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,iBAC1F,GACF;AAAA,cACA,gBAAAA,KAAC,UAAK,WAAU,kBAAiB,2BAAa;AAAA;AAAA;AAAA,QAChD;AAAA,QAGD,aAAa,aAAa,IAAI,CAAC,MAAM;AACpC,gBAAM,cAAc,EAAE,QAAQ,SAAS;AACvC,iBACE,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM,cAAc,CAAC;AAAA,cAE9B;AAAA,gCAAAD,KAAC,UAAK,WAAU,oBAAmB,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GACvF,0BAAAA,KAAC,SAAI,KAAK,EAAE,QAAQ,MAAM,KAAI,IAAG,WAAU,kBAAiB,GAC9D;AAAA,gBACA,gBAAAA,KAAC,UAAK,WAAU,kBAAkB,YAAE,QAAQ,MAAK;AAAA,gBAChD,eAAe,gBAAAA,KAAC,UAAK,WAAU,sBAAqB,uBAAS;AAAA;AAAA;AAAA,YATzD,EAAE,QAAQ;AAAA,UAUjB;AAAA,QAEJ,CAAC;AAAA,SACH;AAAA,MAEC,iBAAiB,WAAW,KAAK,aAAa,WAAW,KAAK,mBAAmB,WAAW,KAC3F,gBAAAA,KAAC,OAAE,WAAU,WAAU,yFAA2E;AAAA,MAGpG,gBAAAC,MAAC,WAAM,WAAU,yBACf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,OAAO;AAAA;AAAA,QACjD;AAAA,QACA,gBAAAA,KAAC,UAAK,WAAU,mBAAkB;AAAA,QAClC,gBAAAC,MAAC,UAAK,WAAU,wBACd;AAAA,0BAAAD,KAAC,UAAK,6BAAe;AAAA,UACrB,gBAAAA,KAAC,UAAK,yCAA2B;AAAA,WACnC;AAAA,SACF;AAAA,MAEC,SAAS,gBAAAA,KAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,OAC3C;AAAA,IAED,YAAY,CAAC,WACZ,gBAAAA,KAAC,OAAE,WAAU,aACX,0BAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM,aAAa,eAAe,GAAG,kBAExF,GACF;AAAA,KAEJ;AAEJ;;;AGhZA,SAAS,YAAAI,iBAAgC;AA4CnC,SACE,OAAAC,MADF,QAAAC,aAAA;AAvCC,SAAS,qBAAqB;AACnC,QAAM,EAAE,gBAAgB,eAAe,aAAa,IAAI,gBAAgB;AACxE,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAe,OAAO;AAC9C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,EAAE;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAE5C,QAAM,iBAAiB,OAAO,MAAiB;AAC7C,MAAE,eAAe;AACjB,aAAS,EAAE;AACX,eAAW,IAAI;AACf,QAAI;AACF,YAAM,eAAe,KAAK;AAC1B,cAAQ,OAAO;AAAA,IACjB,SAAS,KAAc;AACrB,eAAS,eAAe,QAAQ,IAAI,UAAU,kDAAkD;AAAA,IAClG,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,MAAiB;AAC1C,MAAE,eAAe;AACjB,aAAS,EAAE;AACX,eAAW,IAAI;AACf,QAAI;AACF,YAAM,cAAc,MAAM,KAAK,GAAG,QAAQ;AAC1C,cAAQ,MAAM;AAAA,IAChB,SAAS,KAAc;AACrB,eAAS,eAAe,QAAQ,IAAI,UAAU,kDAAkD;AAAA,IAClG,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,SAAS,QAAQ;AACnB,WACE,gBAAAD,MAAC,SAAI,WAAU,UACb;AAAA,sBAAAD,KAAC,QAAG,WAAU,gBAAe,8BAAgB;AAAA,MAC7C,gBAAAA,KAAC,OAAE,WAAU,WAAU,gEAAkD;AAAA,MACzE,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,SAAS,MAAM,aAAa,aAAa,GAAG,qBAEpG;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,SAAS,SAAS;AACpB,WACE,gBAAAC,MAAC,SAAI,WAAU,UACb;AAAA,sBAAAD,KAAC,QAAG,WAAU,gBAAe,8BAAgB;AAAA,MAC7C,gBAAAC,MAAC,OAAE,WAAU,WAAU;AAAA;AAAA,QAAwB,gBAAAD,KAAC,YAAQ,iBAAM;AAAA,QAAS;AAAA,SAAwC;AAAA,MAC/G,gBAAAC,MAAC,UAAK,UAAU,aAAa,WAAU,WACrC;AAAA,wBAAAA,MAAC,WAAM,WAAU,YAAW;AAAA;AAAA,UAE1B,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,cACxC,aAAY;AAAA,cACZ,UAAQ;AAAA,cACR,cAAa;AAAA;AAAA,UACf;AAAA,WACF;AAAA,QACA,gBAAAC,MAAC,WAAM,WAAU,YAAW;AAAA;AAAA,UAE1B,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,cAC3C,aAAY;AAAA,cACZ,UAAQ;AAAA,cACR,cAAa;AAAA,cACb,WAAW;AAAA;AAAA,UACb;AAAA,WACF;AAAA,QACC,SAAS,gBAAAA,KAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,QACzC,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,UAAU,SAC/D,oBAAU,iBAAiB,kBAC9B;AAAA,SACF;AAAA,MACA,gBAAAA,KAAC,OAAE,WAAU,aACX,0BAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM,QAAQ,OAAO,GAAG,yBAE3E,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,MAAC,SAAI,WAAU,UACb;AAAA,oBAAAD,KAAC,QAAG,WAAU,gBAAe,iCAAmB;AAAA,IAChD,gBAAAA,KAAC,OAAE,WAAU,WAAU,+DAAiD;AAAA,IACxE,gBAAAC,MAAC,UAAK,UAAU,gBAAgB,WAAU,WACxC;AAAA,sBAAAA,MAAC,WAAM,WAAU,YAAW;AAAA;AAAA,QAE1B,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC,aAAY;AAAA,YACZ,UAAQ;AAAA,YACR,cAAa;AAAA;AAAA,QACf;AAAA,SACF;AAAA,MACC,SAAS,gBAAAA,KAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,MACzC,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,UAAU,SAC/D,oBAAU,eAAe,mBAC5B;AAAA,OACF;AAAA,IACA,gBAAAA,KAAC,OAAE,WAAU,aACX,0BAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM,aAAa,aAAa,GAAG,6BAEtF,GACF;AAAA,KACF;AAEJ;;;AChIA,SAAS,YAAAG,WAAU,UAAAC,SAAQ,aAAAC,YAAW,eAAAC,oBAAmB;AAkDnD,SAEI,OAAAC,MAFJ,QAAAC,aAAA;AA/CC,SAAS,gBAAgB;AAC9B,QAAM,EAAE,WAAW,oBAAoB,aAAa,IAAI,gBAAgB;AACxE,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAS,EAAE;AACnC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,WAAWC,QAAyB,IAAI;AAC9C,QAAM,gBAAgBA,QAAO,KAAK;AAElC,EAAAC,WAAU,MAAM;AACd,aAAS,SAAS,MAAM;AAAA,EAC1B,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,aAAaC,aAAY,OAAO,WAAmB,eAAwB;AAC/E,QAAI,cAAc,WAAW,CAAC,UAAU,KAAK,EAAG;AAChD,kBAAc,UAAU;AACxB,eAAW,IAAI;AACf,aAAS,EAAE;AACX,QAAI;AACF,UAAI,YAAY;AACd,cAAM,mBAAmB,UAAU,KAAK,CAAC;AAAA,MAC3C,OAAO;AACL,cAAM,UAAU,UAAU,KAAK,CAAC;AAAA,MAClC;AAAA,IACF,SAAS,KAAc;AACrB,eAAS,eAAe,QAAQ,IAAI,UAAU,wCAAwC;AAAA,IACxF,UAAE;AACA,iBAAW,KAAK;AAChB,oBAAc,UAAU;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,WAAW,kBAAkB,CAAC;AAElC,QAAM,eAAe,OAAO,MAAwB;AAClD,OAAG,eAAe;AAClB,UAAM,WAAW,MAAM,WAAW;AAAA,EACpC;AAEA,QAAM,mBAAmB,CAAC,UAAkB;AAC1C,YAAQ,KAAK;AAEb,QAAI,CAAC,eAAe,MAAM,WAAW,KAAK,UAAU,KAAK,KAAK,GAAG;AAC/D,iBAAW,OAAO,KAAK;AAAA,IACzB;AAAA,EACF;AAEA,SACE,gBAAAJ,MAAC,SAAI,WAAU,UACb;AAAA,oBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM,aAAa,eAAe,GACnF;AAAA,sBAAAD,KAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,0BAAAA,KAAC,UAAK,GAAE,kBAAiB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAO,GAC/G;AAAA,MAAM;AAAA,OAER;AAAA,IAEA,gBAAAA,KAAC,OAAE,WAAU,2BAA0B,OAAO,EAAE,WAAW,EAAE,GAC1D,wBACG,sCACA,uDAEN;AAAA,IAEC,SAAS,gBAAAA,KAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,IAEzC,gBAAAC,MAAC,UAAK,UAAU,cAAc,WAAU,WACtC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAU;AAAA,UACV,MAAK;AAAA,UACL,WAAW,cAAc,SAAS;AAAA,UAClC,cAAa;AAAA,UACb,aAAa,cAAc,kBAAkB;AAAA,UAC7C,WAAW,cAAc,KAAK;AAAA,UAC9B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,KAAK;AAAA,UAChD,OAAO,cAAc,CAAC,IAAI,EAAE,WAAW,UAAU,eAAe,SAAS,UAAU,UAAU;AAAA;AAAA,MAC/F;AAAA,MACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,UAAU,WAAW,CAAC,KAAK,KAAK,GACrF,oBAAU,iBAAiB,UAC9B;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM;AAAE,yBAAe,CAAC,WAAW;AAAG,kBAAQ,EAAE;AAAG,mBAAS,EAAE;AAAA,QAAG;AAAA,QAC1E,OAAO,EAAE,WAAW,GAAG;AAAA,QAEtB,wBAAc,mCAAmC;AAAA;AAAA,IACpD;AAAA,KACF;AAEJ;;;AV3Ee,SA6CL,YAAAM,WA7CK,OAAAC,MAqDD,QAAAC,aArDC;AANR,SAAS,aAAa;AAC3B,QAAM,EAAE,OAAO,YAAY,OAAO,IAAI,gBAAgB;AAEtD,QAAM,aAAa,MAAM;AACvB,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAO,gBAAAD,KAAC,kBAAe;AAAA,MACzB,KAAK;AACH,eAAO,gBAAAA,KAAC,qBAAkB;AAAA,MAC5B,KAAK;AACH,eAAO,gBAAAA,KAAC,gBAAa;AAAA,MACvB,KAAK;AACH,eAAO,gBAAAA,KAAC,qBAAkB;AAAA,MAC5B,KAAK;AACH,eAAO,gBAAAA,KAAC,sBAAmB;AAAA,MAC7B,KAAK;AACH,eAAO,gBAAAA,KAAC,iBAAc;AAAA,MACxB,KAAK;AACH,eAAO,gBAAAA,KAAC,wBAAqB;AAAA,MAC/B,KAAK;AACH,eAAO,gBAAAA,KAAC,oBAAiB;AAAA,MAC3B,KAAK;AACH,eAAO,gBAAAA,KAAC,eAAY;AAAA,MACtB,KAAK;AAAA,MACL;AACE,eAAO,gBAAAA,KAAC,gBAAa;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO,gBAAAA,KAAC,SAAI,WAAU,WAAW,iBAAO,WAAW,UAAsB;AAAA,IAC3E;AACA,QAAI,OAAO,YAAY,MAAM;AAC3B,aAAO,gBAAAA,KAAC,SAAI,KAAK,OAAO,WAAW,MAAM,KAAI,IAAG,WAAU,WAAU;AAAA,IACtE;AACA,WAAO;AAAA,EACT;AAEA,SACE,gBAAAA,KAAC,gBAAa,QAAQ,MAAM,QAAQ,SAAS,YAC3C,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,eAAe,OAAO,YAAY,eAAe;AAAA,MACnD;AAAA,MACA,cAAY,OAAO,YAAY,SAAS;AAAA,MAEvC,gBAAM,SAAS,aAAa,MAAM,SAAS,WAAW,MAAM,SAAS,sBACpE,WAAW,IAEX,gBAAAC,MAAAF,WAAA,EACG;AAAA,mBAAW;AAAA,QAEZ,gBAAAC,KAAC,QAAG,WAAU,kBACX,iBAAO,YAAY,SAAS,qBAC/B;AAAA,QACC,WAAW;AAAA,SACV,OAAO,YAAY,YAAY,OAAO,YAAY,eAClD,gBAAAC,MAAC,OAAE,WAAU,YAAW;AAAA;AAAA,UACU;AAAA,UAC/B,OAAO,WAAW,YACjB,gBAAAD,KAAC,OAAE,MAAM,OAAO,WAAW,UAAU,QAAO,UAAS,KAAI,uBAAsB,WAAU,iBAAgB,mBAAK;AAAA,UAE/G,OAAO,WAAW,YAAY,OAAO,WAAW,cAAc;AAAA,UAC9D,OAAO,WAAW,cACjB,gBAAAA,KAAC,OAAE,MAAM,OAAO,WAAW,YAAY,QAAO,UAAS,KAAI,uBAAsB,WAAU,iBAAgB,4BAAc;AAAA,WAE7H;AAAA,QAEF,gBAAAA,KAAC,YAAS;AAAA,SACZ;AAAA;AAAA,EAEJ,GACF;AAEJ;AAIA,IAAM,YAAY,MAChB,gBAAAA,KAAC,SAAI,WAAU,uBACb,0BAAAC,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,WAAU,kBACpE;AAAA,kBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,EACxF,gBAAAA,KAAC,UAAK,GAAE,gBAAe,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,GACvF,GACF;AAGF,IAAM,UAAU,MACd,gBAAAA,KAAC,SAAI,WAAU,uBACb,0BAAAC,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,WAAU,kBACpE;AAAA,kBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,KAAI,IAAG,OAAM,QAAO,gBAAe,aAAY,OAAM;AAAA,EACzF,gBAAAA,KAAC,YAAO,IAAG,OAAM,IAAG,QAAO,GAAE,KAAI,MAAK,gBAAe;AAAA,EACrD,gBAAAA,KAAC,YAAO,IAAG,MAAK,IAAG,QAAO,GAAE,KAAI,MAAK,gBAAe;AAAA,EACpD,gBAAAA,KAAC,YAAO,IAAG,QAAO,IAAG,QAAO,GAAE,KAAI,MAAK,gBAAe;AAAA,GACxD,GACF;AAGF,IAAM,aAAa,MACjB,gBAAAA,KAAC,SAAI,WAAU,uBACb,0BAAAC,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,WAAU,kBACpE;AAAA,kBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,EACxF,gBAAAA,KAAC,UAAK,GAAE,MAAK,GAAE,KAAI,OAAM,KAAI,QAAO,KAAI,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,GACzF,GACF;AAGF,IAAM,cAAc,MAClB,gBAAAA,KAAC,SAAI,WAAU,uBACb,0BAAAC,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,WAAU,kBACpE;AAAA,kBAAAD,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,EACpE,gBAAAA,KAAC,UAAK,GAAE,2BAA0B,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,EAChG,gBAAAA,KAAC,UAAK,GAAE,mCAAkC,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ;AAAA,GACjI,GACF;AAGF,IAAM,iBAAiB,MACrB,gBAAAA,KAAC,SAAI,WAAU,uBACb,0BAAAA,KAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,WAAU,0BACpE,0BAAAA,KAAC,UAAK,GAAE,uBAAsB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,GAC9F,GACF;AAKF,SAAS,eAAe;AACtB,QAAM,EAAE,cAAc,kBAAkB,OAAO,IAAI,gBAAgB;AACnE,QAAM,UAAU,oBAAoB,MAAM;AAC1C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIE,UAAS,KAAK;AAC1D,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,EAAE;AAEnD,QAAM,gBAAgB,YAAY;AAChC,sBAAkB,IAAI;AACtB,oBAAgB,EAAE;AAClB,QAAI;AACF,YAAM,iBAAiB;AAAA,IACzB,SAAS,KAAc;AACrB,sBAAgB,eAAe,QAAQ,IAAI,UAAU,gCAAgC;AAAA,IACvF,UAAE;AACA,wBAAkB,KAAK;AAAA,IACzB;AAAA,EACF;AAGA,QAAM,WAAwB,CAAC;AAC/B,MAAI,IAAI;AAER,SAAO,IAAI,QAAQ,QAAQ;AACzB,UAAM,SAAS,QAAQ,CAAC;AAExB,QAAI,cAAc,MAAM,GAAG;AAEzB,YAAM,aAA4B,CAAC;AACnC,aAAO,IAAI,QAAQ,UAAU,cAAc,QAAQ,CAAC,CAAC,GAAG;AACtD,mBAAW,KAAK,QAAQ,CAAC,CAAC;AAC1B;AAAA,MACF;AAGA,UAAI,SAAS,SAAS,GAAG;AACvB,iBAAS,KAAK,gBAAAF,KAAC,SAAwC,WAAU,cAAa,0BAAAA,KAAC,UAAK,gBAAE,KAA9D,cAAc,WAAW,CAAC,CAAC,EAA0C,CAAM;AAAA,MACrG;AAEA,eAAS;AAAA,QACP,gBAAAA,KAAC,SAA0C,WAAU,kBAClD,qBAAW,IAAI,CAAC,MACf,gBAAAA,KAAC,eAAoB,UAAU,KAAb,CAAuB,CAC1C,KAHO,SAAS,WAAW,KAAK,GAAG,CAAC,EAIvC;AAAA,MACF;AAAA,IACF,OAAO;AAEL,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,OAAO,QAAQ,IAAI,CAAC;AAC1B,YAAI,QAAQ,cAAc,IAAI,GAAG;AAC/B,mBAAS,KAAK,gBAAAA,KAAC,SAA8B,WAAU,cAAa,0BAAAA,KAAC,UAAK,gBAAE,KAApD,aAAa,IAAI,EAA0C,CAAM;AAAA,QAC3F;AAAA,MACF;AAEA,cAAQ,QAAQ;AAAA,QACd,KAAK;AACH,mBAAS;AAAA,YACP,gBAAAC,MAAC,YAAmB,MAAK,UAAS,WAAU,wBAAuB,SAAS,MAAM,aAAa,aAAa,GAC1G;AAAA,8BAAAD,KAAC,aAAU;AAAA,cAAE;AAAA,cAAC,gBAAAA,KAAC,UAAK,WAAU,eAAc,sBAAQ;AAAA,iBAD1C,OAEZ;AAAA,UACF;AACA;AAAA,QACF,KAAK;AACH,mBAAS;AAAA,YACP,gBAAAC,MAAC,YAAiB,MAAK,UAAS,WAAU,wBAAuB,SAAS,MAAM,aAAa,WAAW,GACtG;AAAA,8BAAAD,KAAC,WAAQ;AAAA,cAAE;AAAA,cAAC,gBAAAA,KAAC,UAAK,WAAU,eAAc,wBAAU;AAAA,iBAD1C,KAEZ;AAAA,UACF;AACA;AAAA,QACF,KAAK;AACH,mBAAS;AAAA,YACP,gBAAAC,MAAC,YAAoB,MAAK,UAAS,WAAU,wBAAuB,SAAS,MAAM,aAAa,gBAAgB,GAC9G;AAAA,8BAAAD,KAAC,cAAW;AAAA,cAAE;AAAA,cAAC,gBAAAA,KAAC,UAAK,WAAU,eAAc,oBAAM;AAAA,iBADzC,QAEZ;AAAA,UACF;AACA;AAAA,QACF,KAAK;AACH,mBAAS;AAAA,YACP,gBAAAC,MAAC,YAAqB,MAAK,UAAS,WAAU,wBAAuB,SAAS,eAAe,UAAU,gBACpG;AAAA,+BAAiB,gBAAAD,KAAC,kBAAe,IAAK,gBAAAA,KAAC,eAAY;AAAA,cACpD,gBAAAA,KAAC,UAAK,WAAU,eAAe,2BAAiB,2BAA2B,WAAU;AAAA,iBAF3E,SAGZ;AAAA,UACF;AACA;AAAA,MACJ;AACA;AAAA,IACF;AAAA,EACF;AAEA,SACE,gBAAAC,MAAC,SAAI,WAAU,oBACZ;AAAA,oBAAgB,gBAAAD,KAAC,OAAE,WAAU,YAAY,wBAAa;AAAA,IACtD;AAAA,KACH;AAEJ;AAIA,SAAS,mBAAmB;AAC1B,QAAM,EAAE,aAAa,IAAI,gBAAgB;AAEzC,SACE,gBAAAC,MAAC,SAAI,WAAU,cACb;AAAA,oBAAAD,KAAC,SAAI,WAAU,mBACb,0BAAAA,KAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,WAAU,WACxD,0BAAAA,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,QAAO,QAAO,6BAA4B,aAAY,KAAI,eAAc,SAAQ,iBAAgB,OAAM,kBAAiB,MAAK,GAClK,GACF;AAAA,IACA,gBAAAA,KAAC,OAAE,WAAU,mBAAkB,mCAAqB;AAAA,IACpD,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,OAAO,EAAE,WAAW,OAAO,GAAG,SAAS,MAAM,aAAa,eAAe,GAAG,oBAEtI;AAAA,KACF;AAEJ;AAIA,IAAM,YAAY;AAElB,SAAS,WAAW;AAClB,SACE,gBAAAA,KAAC,SAAI,WAAU,gBACb,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,WAAU;AAAA,MAEV;AAAA,wBAAAD,KAAC,UAAK,wBAAU;AAAA,QAChB,gBAAAA,KAAC,WAAQ,KAAK,WAAW,WAAU,gBAAe;AAAA;AAAA;AAAA,EACpD,GACF;AAEJ;AAIA,IAAM,iBAAiB;AAAA,EACrB,QACE,gBAAAC,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,IACxF,gBAAAA,KAAC,UAAK,GAAE,MAAK,GAAE,KAAI,OAAM,KAAI,QAAO,KAAI,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,KACzF;AAAA,EAEF,OACE,gBAAAC,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,IACxF,gBAAAA,KAAC,UAAK,GAAE,gBAAe,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,KACvF;AAAA,EAEF,SACE,gBAAAA,KAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD,0BAAAA,KAAC,UAAK,GAAE,+JAA8J,GACxK;AAAA,EAEF,SACE,gBAAAA,KAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD,0BAAAA,KAAC,UAAK,GAAE,sgCAAqgC,GAC/gC;AAAA,EAEF,UACE,gBAAAA,KAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD,0BAAAA,KAAC,UAAK,GAAE,2kBAA0kB,GACplB;AAEJ;AAEA,SAAS,uBAAuB;AAC9B,QAAM,EAAE,kBAAkB,wBAAwB,IAAI,gBAAgB;AACtE,QAAM,CAAC,SAAS,UAAU,IAAIE,UAAoC,IAAI;AACtE,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AAErC,MAAI,CAAC,iBAAkB,QAAO;AAC9B,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,QAAQ,UAAU,QAAQ,SAAS,UAAU,QAAQ,UAAU,UAAU,QAAQ,IAAI;AAE3F,QAAM,SAAS,OAAO,YAAqB;AACzC,eAAW,UAAU,YAAY,MAAM;AACvC,aAAS,EAAE;AACX,QAAI;AACF,YAAM,wBAAwB,OAAO;AAAA,IACvC,SAAS,KAAc;AACrB,eAAS,eAAe,QAAQ,IAAI,UAAU,uBAAuB;AACrE,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,QAAMC,YAAW,CAAC,GAAW,IAAI,MAAO,EAAE,SAAS,IAAI,IAAI,IAAI,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,SAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK;AAEnG,SACE,gBAAAF,MAAC,SAAI,WAAU,UACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,QAAG,WAAU,kBAAiB,OAAO,EAAE,QAAQ,EAAE,GAAG,oCAAsB;AAAA,MAC3E,gBAAAC,MAAC,OAAE,WAAU,cAAa;AAAA;AAAA,QAClB;AAAA,QAAM;AAAA,QAAE,QAAQ,IAAI,aAAa;AAAA,QAAU;AAAA,SACnD;AAAA,OACF;AAAA,IAEA,gBAAAA,MAAC,QAAG,WAAU,eACX;AAAA,gBAAU,QAAQ,IAAI,CAAC,MACtB,gBAAAA,MAAC,QAA0B,WAAU,eACnC;AAAA,wBAAAD,KAAC,UAAK,WAAU,aAAa,yBAAe,QAAO;AAAA,QACnD,gBAAAA,KAAC,UAAK,WAAU,gBAAe,oBAAM;AAAA,QACrC,gBAAAA,KAAC,UAAK,WAAU,gBAAe,0BAAAA,KAAC,UAAM,UAAAG,UAAS,EAAE,OAAO,GAAE,GAAO;AAAA,WAH1D,KAAK,EAAE,OAAO,EAIvB,CACD;AAAA,MACA,UAAU,QAAQ,IAAI,CAAC,MACtB,gBAAAF,MAAC,QAA6C,WAAU,eACtD;AAAA,wBAAAD,KAAC,UAAK,WAAU,aAAa,yBAAe,EAAE,QAAQ,GAAE;AAAA,QACxD,gBAAAA,KAAC,UAAK,WAAU,gBAAe,OAAO,EAAE,eAAe,aAAa,GAAI,YAAE,aAAa,YAAY,MAAM,EAAE,UAAS;AAAA,QACpH,gBAAAC,MAAC,UAAK,WAAU,gBAAe;AAAA;AAAA,UAAE,EAAE;AAAA,WAAa;AAAA,WAHzC,KAAK,EAAE,QAAQ,IAAI,EAAE,YAAY,EAI1C,CACD;AAAA,MACA,UAAU,SACT,gBAAAA,MAAC,QAAG,WAAU,eACZ;AAAA,wBAAAD,KAAC,UAAK,WAAU,aAAa,yBAAe,OAAM;AAAA,QAClD,gBAAAA,KAAC,UAAK,WAAU,gBAAe,mBAAK;AAAA,QACpC,gBAAAA,KAAC,UAAK,WAAU,gBAAgB,oBAAU,MAAM,OAAM;AAAA,SACxD;AAAA,OAEJ;AAAA,IAEC,SAAS,gBAAAA,KAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,IAEzC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,OAAO,IAAI;AAAA,QAC1B,UAAU,YAAY;AAAA,QAErB,sBAAY,YAAY,iBAAY,QAAQ,QAAQ,IAAI,aAAa,IAAI;AAAA;AAAA,IAC5E;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,OAAO,KAAK;AAAA,QAC3B,UAAU,YAAY;AAAA,QAErB,sBAAY,SAAS,mBAAc;AAAA;AAAA,IACtC;AAAA,KACF;AAEJ;AAIA,SAAS,cAAc;AACrB,SACE,gBAAAC,MAAC,SAAI,WAAU,cACb;AAAA,oBAAAD,KAAC,SAAI,WAAU,mBACb,0BAAAC,MAAC,SAAI,SAAQ,aAAY,WAAU,oBACjC;AAAA,sBAAAD,KAAC,YAAO,WAAU,qBAAoB,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,QAAO;AAAA,MACzE,gBAAAA,KAAC,UAAK,WAAU,mBAAkB,MAAK,QAAO,GAAE,wBAAuB;AAAA,OACzE,GACF;AAAA,IACA,gBAAAA,KAAC,OAAE,WAAU,mBAAkB,uBAAS;AAAA,KAC1C;AAEJ;;;AWlZA,SAAS,YAAAI,YAAU,aAAAC,aAAW,UAAAC,SAAQ,eAAAC,oBAAmB;;;ACAzD,SAAS,YAAAC,WAAU,eAAAC,cAAa,aAAAC,YAAW,UAAAC,eAAc;AAIlD,SAAS,UAAU;AACxB,QAAM,EAAE,MAAM,KAAK,QAAQ,eAAe,IAAI,gBAAgB;AAC9D,QAAM,CAAC,aAAa,cAAc,IAAIC,UAA8B,IAAI;AACxE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,oBAAoBC,QAAO,KAAK;AAEtC,QAAM,gBAAgBC;AAAA,IACpB,OAAO,SAAuD;AAC5D,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,aAAO,IAAI,SAAS,OAAO,IAAI;AAAA,IACjC;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,QAAM,mBAAmBA,aAAY,YAAY;AAC/C,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,eAAW,IAAI;AACf,QAAI;AACF,YAAM,UAAU,MAAM,IAAI,eAAe,KAAK;AAC9C,qBAAe,OAAuB;AACtC,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,KAAK,cAAc,CAAC;AAExB,QAAM,iBAAiBA;AAAA,IACrB,OAAO,SAAoI;AACzI,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,eAAe,OAAO,IAAI;AACpC,YAAM,iBAAiB;AAAA,IACzB;AAAA,IACA,CAAC,KAAK,gBAAgB,gBAAgB;AAAA,EACxC;AAEA,QAAM,cAAcA;AAAA,IAClB,OAAO,UAAkB;AACvB,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,YAAY,OAAO,KAAK;AAAA,IACpC;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,QAAM,gBAAgBA;AAAA,IACpB,OAAO,OAAe,SAAiB;AACrC,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,cAAc,OAAO,OAAO,IAAI;AAC1C,YAAM,iBAAiB;AAAA,IACzB;AAAA,IACA,CAAC,KAAK,gBAAgB,gBAAgB;AAAA,EACxC;AAEA,QAAM,mBAAmBA;AAAA,IACvB,OAAO,OAAe;AACpB,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,iBAAiB,OAAO,EAAE;AACpC,YAAM,iBAAiB;AAAA,IACzB;AAAA,IACA,CAAC,KAAK,gBAAgB,gBAAgB;AAAA,EACxC;AAIA,QAAM,YAAYA;AAAA,IAChB,OAAO,aAAqB;AAC1B,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AAGzD,YAAM,EAAE,YAAY,IAAI,MAAM,IAAI,iBAAiB,KAAK;AAExD,YAAM,cAAc,mBAAmB,OAAO,SAAS,SAAS,oBAAoB;AACpF,YAAM,MAAM,GAAG,OAAO,MAAM,eAAe,QAAQ,gBAAgB,mBAAmB,WAAW,CAAC,iBAAiB,WAAW;AAC9H,YAAM,QAAQ;AACd,YAAM,SAAS;AACf,YAAM,OAAO,OAAO,WAAW,OAAO,aAAa,SAAS;AAC5D,YAAM,MAAM,OAAO,WAAW,OAAO,cAAc,UAAU;AAC7D,aAAO,KAAK,KAAK,iBAAiB,SAAS,KAAK,WAAW,MAAM,SAAS,IAAI,QAAQ,GAAG,EAAE;AAC3F,wBAAkB,UAAU;AAAA,IAC9B;AAAA,IACA,CAAC,KAAK,OAAO,QAAQ,cAAc;AAAA,EACrC;AAGA,EAAAC,WAAU,MAAM;AACd,UAAM,gBAAgB,CAAC,UAAwB;AAC7C,UAAI,MAAM,WAAW,OAAO,SAAS,OAAQ;AAC7C,UAAI,MAAM,MAAM,SAAS,2BAA2B,kBAAkB,SAAS;AAC7E,0BAAkB,UAAU;AAC5B,yBAAiB,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACnC;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,gBAAgB,CAAC;AAErB,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACvHA,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;;;ACAtC,IAAM,kBAAkB;AAEjB,SAAS,mBAAmB,OAA2B;AAC5D,QAAM,SAAS,CAAC,CAAC;AACjB,aAAW,QAAQ,OAAO;AACxB,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,eAAS,OAAO,CAAC,KAAK;AACtB,aAAO,CAAC,IAAI,QAAQ;AACpB,cAAS,QAAQ,KAAM;AAAA,IACzB;AACA,WAAO,QAAQ,GAAG;AAChB,aAAO,KAAK,QAAQ,EAAE;AACtB,cAAS,QAAQ,KAAM;AAAA,IACzB;AAAA,EACF;AACA,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,MAAM,UAAU,MAAM,CAAC,MAAM,GAAG,KAAK;AACvD,WAAO;AAAA,EACT;AACA,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,WAAO,gBAAgB,OAAO,CAAC,CAAC;AAAA,EAClC;AACA,SAAO;AACT;AAEO,SAAS,QAAQ,SAAyB;AAC/C,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,OAAO,IAAI,KAAK,OAAO,EAAE,QAAQ;AACvC,QAAM,OAAO,MAAM;AACnB,QAAM,OAAO,KAAK,MAAM,OAAO,GAAK;AACpC,MAAI,OAAO,EAAG,QAAO;AACrB,MAAI,OAAO,GAAI,QAAO,GAAG,IAAI;AAC7B,QAAM,QAAQ,KAAK,MAAM,OAAO,EAAE;AAClC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK;AAC/B,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,MAAI,OAAO,GAAI,QAAO,GAAG,IAAI;AAC7B,SAAO,IAAI,KAAK,OAAO,EAAE,mBAAmB;AAC9C;;;ADjCO,SAAS,aAAa;AAC3B,QAAM,EAAE,KAAK,eAAe,IAAI,gBAAgB;AAChD,QAAM,CAAC,SAAS,UAAU,IAAIC,UAA0B,IAAI;AAC5D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAE5C,QAAM,eAAeC,aAAY,YAAY;AAC3C,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,eAAW,IAAI;AACf,QAAI;AACF,YAAM,OAAO,MAAM,IAAI,WAAW,KAAK;AACvC,iBAAW,IAAgB;AAC3B,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,KAAK,cAAc,CAAC;AAExB,QAAM,eAAeA;AAAA,IACnB,OAAO,IAAY,SAAkD;AACnE,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,aAAa,OAAO,IAAI,IAAI;AACtC,YAAM,aAAa;AAAA,IACrB;AAAA,IACA,CAAC,KAAK,gBAAgB,YAAY;AAAA,EACpC;AAEA,QAAM,aAAaA;AAAA,IACjB,OACE,eACA,aACA,QAAgB,UAChB,oBACG;AACH,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AAEzD,UAAI,aAAa;AAEf,cAAM,EAAE,aAAa,SAAS,iBAAiB,IAAI,MAAM,IAAI,gBAAgB,eAAe,KAAK;AACjG,cAAM,UAAU,IAAI,YAAY,EAAE,OAAO,gBAAgB;AACzD,cAAM,iBAAiB,MAAM,YAAY,OAAO;AAChD,cAAM,YAAY,UAAU,WACxB,mBAAmB,cAAc,IACjC,MAAM,KAAK,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAClF,cAAM,IAAI,eAAe,OAAO;AAAA,UAC9B,UAAU,GAAG,KAAK;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AAEL,YAAI,CAAC,iBAAiB;AACpB,gBAAM,IAAI,MAAM,iEAAiE;AAAA,QACnF;AACA,cAAM,EAAE,aAAa,aAAa,SAAS,IAAI,MAAM,IAAI,kBAAkB,eAAe,KAAK;AAC/F,cAAM,iBAAiB,MAAM,gBAAgB,QAAQ;AACrD,cAAM,IAAI,eAAe,OAAO;AAAA,UAC9B,UAAU,GAAG,KAAK;AAAA,UAClB;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,MACH;AAEA,YAAM,aAAa;AAAA,IACrB;AAAA,IACA,CAAC,KAAK,gBAAgB,YAAY;AAAA,EACpC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AEpFA,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;AAI/B,SAAS,cAAc;AAC5B,QAAM,EAAE,KAAK,eAAe,IAAI,gBAAgB;AAChD,QAAM,CAAC,UAAU,WAAW,IAAIC,UAA2B,IAAI;AAC/D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAE5C,QAAM,gBAAgBC,aAAY,YAAY;AAC5C,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,eAAW,IAAI;AACf,QAAI;AACF,YAAM,OAAO,MAAM,IAAI,YAAY,KAAK;AACxC,kBAAY,IAAiB;AAC7B,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,KAAK,cAAc,CAAC;AAExB,QAAM,gBAAgBA;AAAA,IACpB,OAAO,OAAe;AACpB,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,cAAc,OAAO,EAAE;AACjC,YAAM,cAAc;AAAA,IACtB;AAAA,IACA,CAAC,KAAK,gBAAgB,aAAa;AAAA,EACrC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACtCA,SAAS,YAAAC,YAAU,aAAAC,kBAAiB;AAkI1B,qBAAAC,WACE,OAAAC,OAeI,QAAAC,aAhBN;AArHH,SAAS,eAAe,EAAE,QAAQ,SAAS,gBAAgB,eAAe,GAAwB;AACvG,QAAM,EAAE,KAAK,gBAAgB,OAAO,IAAI,gBAAgB;AACxD,QAAM,QAAQ,OAAO,YAAY,SAAS;AAE1C,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAe,iBAAiB,WAAW,OAAO;AAG1E,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAoF,IAAI;AAC1H,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,EAAE;AACnC,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,KAAK,MAAM,IAAIA,WAA+C,IAAI;AACzE,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,KAAK;AAGlD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAmB,CAAC,CAAC;AAE/D,EAAAC,WAAU,MAAM;AACd,QAAI,QAAQ;AACV,cAAQ,iBAAiB,WAAW,OAAO;AAC3C,mBAAa,IAAI;AACjB,cAAQ,EAAE;AACV,aAAO,IAAI;AACX,iBAAW,KAAK;AAChB,oBAAc,KAAK;AACnB,uBAAiB,CAAC,CAAC;AAGnB,UAAI,CAAC,gBAAgB;AACnB,cAAM,QAAQ,eAAe;AAC7B,YAAI,OAAO;AACT,qBAAW,IAAI;AACf,cAAI,SAAS,KAAK,EACf,KAAK,CAAC,SAAS;AACd,yBAAa,IAAI;AACjB,6BAAiB,KAAK,aAAa;AAAA,UACrC,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,mBAAO,EAAE,MAAM,eAAe,QAAQ,IAAI,UAAU,yBAAyB,IAAI,MAAM,CAAC;AAAA,UAC1F,CAAC,EACA,QAAQ,MAAM,WAAW,KAAK,CAAC;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,gBAAgB,KAAK,cAAc,CAAC;AAEhD,QAAM,eAAe,YAAY;AAC/B,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,SAAS,CAAC,KAAM;AACrB,eAAW,IAAI;AACf,WAAO,IAAI;AACX,QAAI;AACF,YAAM,IAAI,UAAU,OAAO,IAAI;AAC/B,qBAAe,IAAI;AACnB,cAAQ,gBAAgB;AACxB,cAAQ,EAAE;AAAA,IACZ,SAAS,KAAc;AACrB,aAAO,EAAE,MAAM,eAAe,QAAQ,IAAI,UAAU,iBAAiB,IAAI,MAAM,CAAC;AAAA,IAClF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY;AAChC,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,SAAS,CAAC,KAAM;AACrB,eAAW,IAAI;AACf,WAAO,IAAI;AACX,QAAI;AACF,YAAM,IAAI,WAAW,OAAO,IAAI;AAChC,qBAAe,KAAK;AACpB,cAAQ,EAAE;AACV,cAAQ;AAAA,IACV,SAAS,KAAc;AACrB,aAAO,EAAE,MAAM,eAAe,QAAQ,IAAI,UAAU,iBAAiB,IAAI,MAAM,CAAC;AAAA,IAClF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,mBAAmB,YAAY;AACnC,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,SAAS,CAAC,KAAM;AACrB,eAAW,IAAI;AACf,WAAO,IAAI;AACX,QAAI;AACF,YAAM,EAAE,eAAe,MAAM,IAAI,MAAM,IAAI,wBAAwB,OAAO,IAAI;AAC9E,uBAAiB,KAAK;AACtB,cAAQ,gBAAgB;AACxB,cAAQ,EAAE;AAAA,IACZ,SAAS,KAAc;AACrB,aAAO,EAAE,MAAM,eAAe,QAAQ,IAAI,UAAU,iBAAiB,IAAI,MAAM,CAAC;AAAA,IAClF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,gBAAgB,MAAM;AAC1B,cAAU,UAAU,UAAU,cAAc,KAAK,IAAI,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACxE;AAEA,QAAM,SAAS,MAAM;AACnB,YAAQ,EAAE;AACV,WAAO,IAAI;AACX,YAAQ,QAAQ;AAAA,EAClB;AAEA,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,gBAAAH,MAAC,gBAAa,QAAgB,SAC5B,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,eAAe,OAAO,YAAY,eAAe,UAAU;AAAA,MACpE,cAAY;AAAA,MAGX;AAAA,iBAAS,WACR,gBAAAA,MAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,QAAG,WAAU,kBAAiB,wBAAU;AAAA,UACxC,OAAO,gBAAAA,MAAC,OAAE,WAAW,IAAI,KAAK,YAAY,YAAa,cAAI,MAAK;AAAA,UAChE,WAAW,CAAC,aAAa,gBAAAA,MAAC,OAAE,WAAU,WAAU,wBAAU;AAAA,UAC1D,aACC,gBAAAC,MAAC,SAAI,WAAU,UACb;AAAA,4BAAAD,MAAC,OAAE,WAAU,2BAA0B,OAAO,EAAE,WAAW,SAAS,GAAG,2DAEvE;AAAA,YACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,UAAU,QAAQ,SAAS,GACxE,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK,UAAU;AAAA,gBACf,KAAI;AAAA,gBACJ,OAAO,EAAE,OAAO,KAAK,QAAQ,KAAK,cAAc,GAAG;AAAA;AAAA,YACrD,GACF;AAAA,YACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,WAAW,UAAU,cAAc,GAAG,GAClD;AAAA,8BAAAD,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM,cAAc,CAAC,UAAU,GAC/E,uBAAa,cAAc,8BAC9B;AAAA,cACC,cACC,gBAAAA,MAAC,OAAE,OAAO,EAAE,QAAQ,WAAW,YAAY,aAAa,UAAU,IAAI,SAAS,KAAK,WAAW,YAAY,GACxG,oBAAU,QACb;AAAA,eAEJ;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,aAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAE,CAAC;AAAA,gBAC1D,OAAO,EAAE,WAAW,UAAU,eAAe,QAAQ;AAAA,gBACrD,WAAS;AAAA;AAAA,YACX;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS;AAAA,gBACT,UAAU,WAAW,KAAK,WAAW;AAAA,gBACrC,OAAO,EAAE,WAAW,GAAG;AAAA,gBAEtB,oBAAU,iBAAiB;AAAA;AAAA,YAC9B;AAAA,aACF;AAAA,WAEJ;AAAA,QAID,SAAS,YACR,gBAAAC,MAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,QAAG,WAAU,kBAAiB,uCAAyB;AAAA,UACxD,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,UAAU,cAAc,GAAG,GAClD,0BAAAA,MAAC,UAAK,WAAU,qBAAoB,OAAO,EAAE,UAAU,IAAI,SAAS,WAAW,GAAG,qBAAO,GAC3F;AAAA,UACA,gBAAAC,MAAC,SAAI,WAAU,UACb;AAAA,4BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,MAAM;AAAE,0BAAQ,EAAE;AAAG,yBAAO,IAAI;AAAG,0BAAQ,oBAAoB;AAAA,gBAAG;AAAA,gBAE3E;AAAA,kCAAAD,MAAC,UAAK,WAAU,yBACd,0BAAAC,MAAC,SAAI,SAAQ,aAAY,MAAK,QAC5B;AAAA,oCAAAD,MAAC,UAAK,GAAE,gFAA+E,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,oBACrJ,gBAAAA,MAAC,UAAK,GAAE,gBAAe,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ;AAAA,qBAC9G,GACF;AAAA,kBACA,gBAAAC,MAAC,UAAK,WAAU,yBACd;AAAA,oCAAAD,MAAC,UAAK,WAAU,0BAAyB,uCAAyB;AAAA,oBAClE,gBAAAA,MAAC,UAAK,WAAU,2BAA0B,kCAAoB;AAAA,qBAChE;AAAA,kBACA,gBAAAA,MAAC,UAAK,WAAU,4BACd,0BAAAA,MAAC,SAAI,SAAQ,aAAY,MAAK,QAC5B,0BAAAA,MAAC,UAAK,GAAE,gBAAe,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GAC9G,GACF;AAAA;AAAA;AAAA,YACF;AAAA,YAEA,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,MAAM;AAAE,0BAAQ,EAAE;AAAG,yBAAO,IAAI;AAAG,0BAAQ,iBAAiB;AAAA,gBAAG;AAAA,gBAExE;AAAA,kCAAAD,MAAC,UAAK,WAAU,yBAAwB,OAAO,EAAE,OAAO,UAAU,GAChE,0BAAAC,MAAC,SAAI,SAAQ,aAAY,MAAK,QAC5B;AAAA,oCAAAD,MAAC,UAAK,GAAE,oEAAmE,QAAO,gBAAe,aAAY,OAAM,gBAAe,SAAQ;AAAA,oBAC1I,gBAAAA,MAAC,UAAK,GAAE,8BAA6B,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,qBACrG,GACF;AAAA,kBACA,gBAAAC,MAAC,UAAK,WAAU,yBACd;AAAA,oCAAAD,MAAC,UAAK,WAAU,0BAAyB,OAAO,EAAE,OAAO,UAAU,GAAG,yBAAW;AAAA,oBACjF,gBAAAA,MAAC,UAAK,WAAU,2BAA0B,8CAAgC;AAAA,qBAC5E;AAAA,kBACA,gBAAAA,MAAC,UAAK,WAAU,4BACd,0BAAAA,MAAC,SAAI,SAAQ,aAAY,MAAK,QAC5B,0BAAAA,MAAC,UAAK,GAAE,gBAAe,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GAC9G,GACF;AAAA;AAAA;AAAA,YACF;AAAA,aACF;AAAA,WACF;AAAA,QAID,SAAS,wBACR,gBAAAC,MAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,QAAG,WAAU,kBAAiB,uCAAyB;AAAA,UACxD,gBAAAA,MAAC,OAAE,WAAU,2BAA0B,OAAO,EAAE,WAAW,SAAS,GAAG,mGAEvE;AAAA,UACC,OAAO,gBAAAA,MAAC,OAAE,WAAW,IAAI,KAAK,YAAY,YAAa,cAAI,MAAK;AAAA,UACjE,gBAAAC,MAAC,SAAI,WAAU,UACb;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,aAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAE,CAAC;AAAA,gBAC1D,OAAO,EAAE,WAAW,UAAU,eAAe,QAAQ;AAAA,gBACrD,WAAS;AAAA;AAAA,YACX;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS;AAAA,gBACT,UAAU,WAAW,KAAK,WAAW;AAAA,gBACrC,OAAO,EAAE,WAAW,GAAG;AAAA,gBAEtB,oBAAU,kBAAkB;AAAA;AAAA,YAC/B;AAAA,YACA,gBAAAA,MAAC,SAAI,WAAU,aAAY,OAAO,EAAE,WAAW,GAAG,GAChD,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,QAAQ,kBAAI,GACjE;AAAA,aACF;AAAA,WACF;AAAA,QAID,SAAS,qBACR,gBAAAC,MAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,QAAG,WAAU,kBAAiB,yBAAW;AAAA,UAC1C,gBAAAA,MAAC,OAAE,WAAU,2BAA0B,OAAO,EAAE,WAAW,SAAS,GAAG,uEAEvE;AAAA,UACC,OAAO,gBAAAA,MAAC,OAAE,WAAW,IAAI,KAAK,YAAY,YAAa,cAAI,MAAK;AAAA,UACjE,gBAAAC,MAAC,SAAI,WAAU,UACb;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,aAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAE,CAAC;AAAA,gBAC1D,OAAO,EAAE,WAAW,UAAU,eAAe,QAAQ;AAAA,gBACrD,WAAS;AAAA;AAAA,YACX;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS;AAAA,gBACT,UAAU,WAAW,KAAK,WAAW;AAAA,gBACrC,OAAO,EAAE,WAAW,IAAI,YAAY,0BAA0B,OAAO,WAAW,aAAa,yBAAyB;AAAA,gBAErH,oBAAU,iBAAiB;AAAA;AAAA,YAC9B;AAAA,YACA,gBAAAA,MAAC,SAAI,WAAU,aAAY,OAAO,EAAE,WAAW,GAAG,GAChD,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,QAAQ,kBAAI,GACjE;AAAA,aACF;AAAA,WACF;AAAA,QAID,SAAS,oBACR,gBAAAC,MAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,QAAG,WAAU,kBAAiB,sCAAwB;AAAA,UACvD,gBAAAA,MAAC,OAAE,WAAU,2BAA0B,OAAO,EAAE,WAAW,SAAS,GAAG,gFAEvE;AAAA,UACA,gBAAAA,MAAC,SAAI,WAAU,oBACZ,wBAAc,IAAI,CAAC,GAAG,MACrB,gBAAAA,MAAC,SAAY,WAAU,oBAAoB,eAAjC,CAAmC,CAC9C,GACH;AAAA,UACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,UAAU,QAAQ,aAAa,GACtD,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,eAAe,sBAElE,GACF;AAAA,UACA,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,SAAS,SAAS,kBAE1E;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ,GACF;AAEJ;;;AC7UA,SAAS,YAAAI,YAAU,aAAAC,YAAW,eAAAC,oBAAmB;;;ACM1C,SAAS,wBAAwB,QAAQ;AAC5C,QAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,MAAI,MAAM;AACV,aAAW,YAAY,OAAO;AAC1B,WAAO,OAAO,aAAa,QAAQ;AAAA,EACvC;AACA,QAAM,eAAe,KAAK,GAAG;AAC7B,SAAO,aAAa,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,MAAM,EAAE;AAChF;;;ACPO,SAAS,wBAAwB,iBAAiB;AAErD,QAAM,SAAS,gBAAgB,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAQnE,QAAM,aAAa,IAAK,OAAO,SAAS,KAAM;AAC9C,QAAM,SAAS,OAAO,OAAO,OAAO,SAAS,WAAW,GAAG;AAE3D,QAAM,SAAS,KAAK,MAAM;AAE1B,QAAM,SAAS,IAAI,YAAY,OAAO,MAAM;AAC5C,QAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,UAAM,CAAC,IAAI,OAAO,WAAW,CAAC;AAAA,EAClC;AACA,SAAO;AACX;;;ACzBO,SAAS,0BAA0B;AACtC,SAAO,kCAAkC,SAAS,YAAY,wBAAwB,UAClF,OAAO,WAAW,wBAAwB,UAAU;AAC5D;AAKO,IAAM,oCAAoC;AAAA,EAC7C,UAAU,CAAC,UAAU;AACzB;;;ACZO,SAAS,gCAAgC,YAAY;AACxD,QAAM,EAAE,GAAG,IAAI;AACf,SAAO;AAAA,IACH,GAAG;AAAA,IACH,IAAI,wBAAwB,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM9B,YAAY,WAAW;AAAA,EAC3B;AACJ;;;ACLO,SAAS,cAAc,UAAU;AACpC;AAAA;AAAA,IAEA,aAAa,eACT,0CAA0C,KAAK,QAAQ;AAAA;AAC/D;;;ACIO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACrC,YAAY,EAAE,SAAS,MAAM,OAAO,KAAM,GAAG;AAEzC,UAAM,SAAS,EAAE,MAAM,CAAC;AACxB,WAAO,eAAe,MAAM,QAAQ;AAAA,MAChC,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,UAAU;AAAA,MACV,OAAO;AAAA,IACX,CAAC;AACD,SAAK,OAAO,QAAQ,MAAM;AAC1B,SAAK,OAAO;AAAA,EAChB;AACJ;;;ACzBO,SAAS,0BAA0B,EAAE,OAAO,QAAS,GAAG;AAC3D,QAAM,EAAE,UAAU,IAAI;AACtB,MAAI,CAAC,WAAW;AACZ,UAAM,MAAM,iDAAiD;AAAA,EACjE;AACA,MAAI,MAAM,SAAS,cAAc;AAC7B,QAAI,QAAQ,kBAAkB,aAAa;AAEvC,aAAO,IAAI,cAAc;AAAA,QACrB,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ,WACS,MAAM,SAAS,mBAAmB;AACvC,QAAI,UAAU,wBAAwB,uBAAuB,MAAM;AAE/D,aAAO,IAAI,cAAc;AAAA,QACrB,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA;AAAA,MAGA,QAAQ,cAAc,iBAClB,UAAU,wBAAwB,qBAAqB;AAAA,MAAY;AAEnE,aAAO,IAAI,cAAc;AAAA,QACrB,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACX,CAAC;AAAA,IACL,WACS,UAAU,wBAAwB,qBAAqB,YAAY;AAExE,aAAO,IAAI,cAAc;AAAA,QACrB,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ,WACS,MAAM,SAAS,qBAAqB;AAGzC,WAAO,IAAI,cAAc;AAAA,MACrB,SAAS;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,IACX,CAAC;AAAA,EACL,WACS,MAAM,SAAS,mBAAmB;AAKvC,WAAO,IAAI,cAAc;AAAA,MACrB,SAAS,MAAM;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,IACX,CAAC;AAAA,EACL,WACS,MAAM,SAAS,qBAAqB;AACzC,UAAM,wBAAwB,UAAU,iBAAiB,OAAO,CAAC,UAAU,MAAM,SAAS,YAAY;AACtG,QAAI,sBAAsB,WAAW,GAAG;AAEpC,aAAO,IAAI,cAAc;AAAA,QACrB,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAEA,WAAO,IAAI,cAAc;AAAA,MACrB,SAAS;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,IACX,CAAC;AAAA,EACL,WACS,MAAM,SAAS,iBAAiB;AACrC,UAAM,kBAAkB,WAAW,SAAS;AAC5C,QAAI,CAAC,cAAc,eAAe,GAAG;AAEjC,aAAO,IAAI,cAAc;AAAA,QACrB,SAAS,GAAG,WAAW,SAAS,QAAQ;AAAA,QACxC,MAAM;AAAA,QACN,OAAO;AAAA,MACX,CAAC;AAAA,IACL,WACS,UAAU,GAAG,OAAO,iBAAiB;AAE1C,aAAO,IAAI,cAAc;AAAA,QACrB,SAAS,cAAc,UAAU,GAAG,EAAE;AAAA,QACtC,MAAM;AAAA,QACN,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ,WACS,MAAM,SAAS,aAAa;AACjC,QAAI,UAAU,KAAK,GAAG,aAAa,KAAK,UAAU,KAAK,GAAG,aAAa,IAAI;AAEvE,aAAO,IAAI,cAAc;AAAA,QACrB,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ,WACS,MAAM,SAAS,gBAAgB;AAGpC,WAAO,IAAI,cAAc;AAAA,MACrB,SAAS;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AACA,SAAO;AACX;;;AC7HA,IAAM,2BAAN,MAA+B;AAAA,EAC3B,cAAc;AACV,WAAO,eAAe,MAAM,cAAc;AAAA,MACtC,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,UAAU;AAAA,MACV,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AAAA,EACA,uBAAuB;AAEnB,QAAI,KAAK,YAAY;AACjB,YAAM,aAAa,IAAI,MAAM,mDAAmD;AAChF,iBAAW,OAAO;AAClB,WAAK,WAAW,MAAM,UAAU;AAAA,IACpC;AACA,UAAM,gBAAgB,IAAI,gBAAgB;AAC1C,SAAK,aAAa;AAClB,WAAO,cAAc;AAAA,EACzB;AAAA,EACA,iBAAiB;AACb,QAAI,KAAK,YAAY;AACjB,YAAM,aAAa,IAAI,MAAM,gDAAgD;AAC7E,iBAAW,OAAO;AAClB,WAAK,WAAW,MAAM,UAAU;AAChC,WAAK,aAAa;AAAA,IACtB;AAAA,EACJ;AACJ;AAQO,IAAM,uBAAuB,IAAI,yBAAyB;;;ACpCjE,IAAM,cAAc,CAAC,kBAAkB,UAAU;AAI1C,SAAS,0BAA0B,YAAY;AAClD,MAAI,CAAC,YAAY;AACb;AAAA,EACJ;AACA,MAAI,YAAY,QAAQ,UAAU,IAAI,GAAG;AACrC;AAAA,EACJ;AACA,SAAO;AACX;;;ACCA,eAAsB,kBAAkB,SAAS;AAE7C,MAAI,CAAC,QAAQ,eAAe,QAAQ,WAAW;AAC3C,YAAQ,KAAK,4TAA4T;AAEzU,cAAU,EAAE,aAAa,QAAQ;AAAA,EACrC;AACA,QAAM,EAAE,aAAa,kBAAkB,MAAM,IAAI;AACjD,MAAI,CAAC,wBAAwB,GAAG;AAC5B,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC/D;AAEA,QAAM,YAAY;AAAA,IACd,GAAG;AAAA,IACH,WAAW,wBAAwB,YAAY,SAAS;AAAA,IACxD,MAAM;AAAA,MACF,GAAG,YAAY;AAAA,MACf,IAAI,wBAAwB,YAAY,KAAK,EAAE;AAAA,IACnD;AAAA,IACA,oBAAoB,YAAY,oBAAoB,IAAI,+BAA+B;AAAA,EAC3F;AAEA,QAAM,gBAAgB,CAAC;AAMvB,MAAI,iBAAiB;AAEjB,kBAAc,YAAY;AAAA,EAC9B;AAEA,gBAAc,YAAY;AAE1B,gBAAc,SAAS,qBAAqB,qBAAqB;AAEjE,MAAI;AACJ,MAAI;AACA,iBAAc,MAAM,UAAU,YAAY,OAAO,aAAa;AAAA,EAClE,SACO,KAAK;AACR,UAAM,0BAA0B,EAAE,OAAO,KAAK,SAAS,cAAc,CAAC;AAAA,EAC1E;AACA,MAAI,CAAC,YAAY;AACb,UAAM,IAAI,MAAM,gCAAgC;AAAA,EACpD;AACA,QAAM,EAAE,IAAI,OAAO,UAAU,KAAK,IAAI;AAEtC,MAAI,aAAa;AACjB,MAAI,OAAO,SAAS,kBAAkB,YAAY;AAC9C,iBAAa,SAAS,cAAc;AAAA,EACxC;AAEA,MAAI,6BAA6B;AACjC,MAAI,OAAO,SAAS,0BAA0B,YAAY;AACtD,QAAI;AACA,mCAA6B,SAAS,sBAAsB;AAAA,IAChE,SACO,OAAO;AACV,iCAA2B,2BAA2B,KAAK;AAAA,IAC/D;AAAA,EACJ;AACA,MAAI,oBAAoB;AACxB,MAAI,OAAO,SAAS,iBAAiB,YAAY;AAC7C,QAAI;AACA,YAAM,aAAa,SAAS,aAAa;AACzC,UAAI,eAAe,MAAM;AACrB,4BAAoB,wBAAwB,UAAU;AAAA,MAC1D;AAAA,IACJ,SACO,OAAO;AACV,iCAA2B,kBAAkB,KAAK;AAAA,IACtD;AAAA,EACJ;AAEA,MAAI;AACJ,MAAI,OAAO,SAAS,yBAAyB,YAAY;AACrD,QAAI;AACA,kCAA4B,wBAAwB,SAAS,qBAAqB,CAAC;AAAA,IACvF,SACO,OAAO;AACV,iCAA2B,0BAA0B,KAAK;AAAA,IAC9D;AAAA,EACJ;AACA,SAAO;AAAA,IACH;AAAA,IACA,OAAO,wBAAwB,KAAK;AAAA,IACpC,UAAU;AAAA,MACN,mBAAmB,wBAAwB,SAAS,iBAAiB;AAAA,MACrE,gBAAgB,wBAAwB,SAAS,cAAc;AAAA,MAC/D;AAAA,MACA,oBAAoB;AAAA,MACpB,WAAW;AAAA,MACX,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,wBAAwB,WAAW,0BAA0B;AAAA,IAC7D,yBAAyB,0BAA0B,WAAW,uBAAuB;AAAA,EACzF;AACJ;AAKA,SAAS,2BAA2B,YAAY,OAAO;AACnD,UAAQ,KAAK,yFAAyF,UAAU;AAAA,GAA6C,KAAK;AACtK;;;ACnHO,SAAS,kCAAkC;AAC9C,MAAI,CAAC,wBAAwB,GAAG;AAC5B,WAAO,0CAA0C,SAAS,IAAI,QAAQ,CAAC,YAAY,QAAQ,KAAK,CAAC,CAAC;AAAA,EACtG;AAOA,QAAM,4BAA4B,WAC7B;AACL,MAAI,2BAA2B,oCAAoC,QAAW;AAC1E,WAAO,0CAA0C,SAAS,IAAI,QAAQ,CAAC,YAAY,QAAQ,KAAK,CAAC,CAAC;AAAA,EACtG;AACA,SAAO,0CAA0C,SAAS,0BAA0B,gCAAgC,CAAC;AACzH;AAEO,IAAM,4CAA4C;AAAA,EACrD,UAAU,CAAC,UAAU;AACzB;;;ACpBO,SAAS,4BAA4B,EAAE,OAAO,QAAS,GAAG;AAC7D,QAAM,EAAE,UAAU,IAAI;AACtB,MAAI,CAAC,WAAW;AACZ,UAAM,MAAM,iDAAiD;AAAA,EACjE;AACA,MAAI,MAAM,SAAS,cAAc;AAC7B,QAAI,QAAQ,kBAAkB,aAAa;AAEvC,aAAO,IAAI,cAAc;AAAA,QACrB,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ,WACS,MAAM,SAAS,mBAAmB;AAKvC,WAAO,IAAI,cAAc;AAAA,MACrB,SAAS,MAAM;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,IACX,CAAC;AAAA,EACL,WACS,MAAM,SAAS,iBAAiB;AACrC,UAAM,kBAAkB,WAAW,SAAS;AAC5C,QAAI,CAAC,cAAc,eAAe,GAAG;AAEjC,aAAO,IAAI,cAAc;AAAA,QACrB,SAAS,GAAG,WAAW,SAAS,QAAQ;AAAA,QACxC,MAAM;AAAA,QACN,OAAO;AAAA,MACX,CAAC;AAAA,IACL,WACS,UAAU,SAAS,iBAAiB;AAEzC,aAAO,IAAI,cAAc;AAAA,QACrB,SAAS,cAAc,UAAU,IAAI;AAAA,QACrC,MAAM;AAAA,QACN,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ,WACS,MAAM,SAAS,gBAAgB;AAGpC,WAAO,IAAI,cAAc;AAAA,MACrB,SAAS;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AACA,SAAO;AACX;;;AC7CA,eAAsB,oBAAoB,SAAS;AAE/C,MAAI,CAAC,QAAQ,eAAe,QAAQ,WAAW;AAC3C,YAAQ,KAAK,8TAA8T;AAE3U,cAAU,EAAE,aAAa,QAAQ;AAAA,EACrC;AACA,QAAM,EAAE,aAAa,qBAAqB,OAAO,6BAA6B,KAAM,IAAI;AACxF,MAAI,CAAC,wBAAwB,GAAG;AAC5B,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC/D;AAGA,MAAI;AACJ,MAAI,YAAY,kBAAkB,WAAW,GAAG;AAC5C,uBAAmB,YAAY,kBAAkB,IAAI,+BAA+B;AAAA,EACxF;AAEA,QAAM,YAAY;AAAA,IACd,GAAG;AAAA,IACH,WAAW,wBAAwB,YAAY,SAAS;AAAA,IACxD;AAAA,EACJ;AAEA,QAAM,aAAa,CAAC;AAKpB,MAAI,oBAAoB;AACpB,QAAI,CAAE,MAAM,gCAAgC,GAAI;AAC5C,YAAM,MAAM,4CAA4C;AAAA,IAC5D;AAEA,UAAM,iBAAiB,SAAS,iBAAiB,iCAAiC;AAElF,QAAI,eAAe,SAAS,KAAK,4BAA4B;AACzD,YAAM,MAAM,mGAAmG;AAAA,IACnH;AAGA,eAAW,YAAY;AAEvB,cAAU,mBAAmB,CAAC;AAAA,EAClC;AAEA,aAAW,YAAY;AAEvB,aAAW,SAAS,qBAAqB,qBAAqB;AAE9D,MAAI;AACJ,MAAI;AACA,iBAAc,MAAM,UAAU,YAAY,IAAI,UAAU;AAAA,EAC5D,SACO,KAAK;AACR,UAAM,4BAA4B,EAAE,OAAO,KAAK,SAAS,WAAW,CAAC;AAAA,EACzE;AACA,MAAI,CAAC,YAAY;AACb,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACtD;AACA,QAAM,EAAE,IAAI,OAAO,UAAU,KAAK,IAAI;AACtC,MAAI,aAAa;AACjB,MAAI,SAAS,YAAY;AACrB,iBAAa,wBAAwB,SAAS,UAAU;AAAA,EAC5D;AAEA,SAAO;AAAA,IACH;AAAA,IACA,OAAO,wBAAwB,KAAK;AAAA,IACpC,UAAU;AAAA,MACN,mBAAmB,wBAAwB,SAAS,iBAAiB;AAAA,MACrE,gBAAgB,wBAAwB,SAAS,cAAc;AAAA,MAC/D,WAAW,wBAAwB,SAAS,SAAS;AAAA,MACrD;AAAA,IACJ;AAAA,IACA;AAAA,IACA,wBAAwB,WAAW,0BAA0B;AAAA,IAC7D,yBAAyB,0BAA0B,WAAW,uBAAuB;AAAA,EACzF;AACJ;;;AbRQ,gBAAAC,OAYQ,QAAAC,cAZR;AAzED,SAAS,cAAc,EAAE,QAAQ,SAAS,cAAc,GAAuB;AACpF,QAAM,EAAE,KAAK,gBAAgB,OAAO,IAAI,gBAAgB;AACxD,QAAM,QAAQ,OAAO,YAAY,SAAS;AAE1C,QAAM,CAAC,UAAU,WAAW,IAAIC,WAAoB,CAAC,CAAC;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,KAAK;AAClD,QAAM,CAAC,KAAK,MAAM,IAAIA,WAAS,EAAE;AAEjC,QAAM,gBAAgBC,aAAY,YAAY;AAC5C,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,MAAO;AACZ,eAAW,IAAI;AACf,QAAI;AACF,YAAM,OAAO,MAAM,IAAI,YAAY,KAAK;AACxC,kBAAY,IAAI;AAChB,oBAAc,KAAK,MAAM;AAAA,IAC3B,QAAQ;AAAA,IAER,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,KAAK,gBAAgB,aAAa,CAAC;AAEvC,EAAAC,WAAU,MAAM;AACd,QAAI,QAAQ;AACV,aAAO,EAAE;AACT,oBAAc;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,QAAQ,aAAa,CAAC;AAE1B,QAAM,YAAY,YAAY;AAC5B,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,MAAO;AACZ,kBAAc,IAAI;AAClB,WAAO,EAAE;AACT,QAAI;AACF,YAAM,EAAE,SAAS,aAAa,IAAI,MAAM,IAAI,0BAA0B,OAAO,OAAO,cAAc,OAAO,cAAc;AACvH,YAAM,cAAc,MAAM,kBAAkB,EAAE,aAAa,QAAQ,CAAC;AACpE,YAAM,UAAU,MAAM,IAAI,0BAA0B,OAAO,cAAc,aAAa,QAAW,OAAO,cAAc,OAAO,cAAc;AAC3I,YAAM,UAAU,CAAC,GAAG,UAAU,OAAO;AACrC,kBAAY,OAAO;AACnB,oBAAc,QAAQ,MAAM;AAAA,IAC9B,SAAS,KAAc;AACrB,aAAO,eAAe,QAAQ,IAAI,UAAU,wBAAwB;AAAA,IACtE,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,OAAe;AACzC,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,MAAO;AACZ,WAAO,EAAE;AACT,QAAI;AACF,YAAM,IAAI,cAAc,OAAO,EAAE;AACjC,YAAM,UAAU,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,kBAAY,OAAO;AACnB,oBAAc,QAAQ,MAAM;AAAA,IAC9B,SAAS,KAAc;AACrB,aAAO,eAAe,QAAQ,IAAI,UAAU,2BAA2B;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,gBAAAJ,MAAC,gBAAa,QAAgB,SAC5B,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,eAAe,OAAO,YAAY,eAAe,UAAU;AAAA,MACpE,cAAY;AAAA,MAEZ;AAAA,wBAAAD,MAAC,QAAG,WAAU,kBAAiB,sBAAQ;AAAA,QACvC,gBAAAA,MAAC,OAAE,WAAU,2BAA0B,OAAO,EAAE,WAAW,SAAS,GAAG,4EAEvE;AAAA,QAEC,OAAO,gBAAAA,MAAC,OAAE,WAAU,YAAY,eAAI;AAAA,QACpC,WAAW,gBAAAA,MAAC,OAAE,WAAU,WAAU,wBAAU;AAAA,QAE7C,gBAAAC,OAAC,SAAI,WAAU,UACZ;AAAA,mBAAS,IAAI,CAAC,OACb,gBAAAA,OAAC,SAAgB,WAAU,mBACzB;AAAA,4BAAAD,MAAC,UAAK,WAAU,wBACd,0BAAAC,OAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD;AAAA,8BAAAD,MAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,cACpE,gBAAAA,MAAC,UAAK,GAAE,2BAA0B,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,cAChG,gBAAAA,MAAC,UAAK,GAAE,mCAAkC,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ;AAAA,eACjI,GACF;AAAA,YACA,gBAAAC,OAAC,SAAI,WAAU,wBACb;AAAA,8BAAAD,MAAC,UAAK,WAAU,yBAAyB,aAAG,QAAQ,WAAU;AAAA,cAC9D,gBAAAC,OAAC,UAAK,WAAU,0BACb;AAAA,mBAAG,cAAc;AAAA,gBACjB,GAAG,aAAa,mBAAgB,QAAQ,GAAG,UAAU,CAAC,KAAK;AAAA,iBAC9D;AAAA,eACF;AAAA,YACA,gBAAAA,OAAC,SAAI,WAAU,2BACZ;AAAA,iBAAG,YAAY,gBAAAD,MAAC,UAAK,WAAU,qBAAoB,oBAAM;AAAA,cAC1D,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,oBAAmB,SAAS,MAAM,aAAa,GAAG,EAAE,GAAG,oBAEvF;AAAA,eACF;AAAA,eApBQ,GAAG,EAqBb,CACD;AAAA,UACA,CAAC,WAAW,SAAS,WAAW,KAAK,gBAAAA,MAAC,OAAE,WAAU,oBAAmB,6BAAe;AAAA,UAErF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cACT,UAAU;AAAA,cACV,OAAO,EAAE,WAAW,EAAE;AAAA,cAErB,uBAAa,cAAc;AAAA;AAAA,UAC9B;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;;;ActIA,SAAS,YAAAK,YAAU,aAAAC,kBAAiB;;;ACgB5B,SACE,OAAAC,OADF,QAAAC,cAAA;AATD,SAAS,UAAU;AAAA,EACxB,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,SACE,gBAAAA,OAAC,SAAI,WAAU,iBACb;AAAA,oBAAAD,MAAC,SAAI,WAAU,iBACb,0BAAAC,OAAC,SAAI,SAAQ,aAAY,WAAU,kBACjC;AAAA,sBAAAD,MAAC,YAAO,WAAU,mBAAkB,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,QAAO;AAAA,MACvE,gBAAAA,MAAC,UAAK,WAAU,oBAAmB,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,MACnE,gBAAAA,MAAC,UAAK,WAAU,oBAAmB,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,OACrE,GACF;AAAA,IACA,gBAAAA,MAAC,OAAE,WAAU,iBAAiB,iBAAM;AAAA,IACnC,WAAW,gBAAAA,MAAC,OAAE,WAAU,oBAAoB,mBAAQ;AAAA,KACnD,WAAW,YACX,gBAAAC,OAAC,SAAI,WAAU,oBACZ;AAAA,iBACC,gBAAAD,MAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,SAAS,SAAS,uBAE1E;AAAA,MAED,WACC,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,SAAS,mBAE5E;AAAA,OAEJ;AAAA,KAEJ;AAEJ;;;ADwBgB,SAmBN,YAAAE,WAlBQ,OAAAC,OADF,QAAAC,cAAA;AAnDT,SAAS,cAAc,EAAE,QAAQ,SAAS,YAAY,GAAuB;AAClF,QAAM,EAAE,KAAK,gBAAgB,OAAO,IAAI,gBAAgB;AACxD,QAAM,QAAQ,OAAO,YAAY,SAAS;AAE1C,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAe,MAAM;AAC7C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAS,EAAE;AACzD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,EAAE;AACjD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AAErC,EAAAC,WAAU,MAAM;AACd,QAAI,QAAQ;AACV,cAAQ,MAAM;AACd,yBAAmB,EAAE;AACrB,qBAAe,EAAE;AACjB,eAAS,EAAE;AACX,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,aAAS,EAAE;AACX,eAAW,IAAI;AACf,QAAI;AACF,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,YAAY,OAAO,aAAa,cAAc,kBAAkB,MAAS;AACnF,cAAQ,MAAM;AAAA,IAChB,SAAS,KAAc;AACrB,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU;AACjD,eAAS,GAAG;AACZ,cAAQ,OAAO;AAAA,IACjB,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,QAAQ,cAAc,oBAAoB;AAEhD,SACE,gBAAAH,MAAC,gBAAa,QAAgB,SAC5B,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,eAAe,OAAO,YAAY,eAAe,UAAU;AAAA,MACpE,cAAY;AAAA,MAEX,mBAAS,SACR,gBAAAC,OAAC,SAAI,WAAU,UAAS,OAAO,EAAE,WAAW,UAAU,SAAS,SAAS,GACtE;AAAA,wBAAAA,OAAC,SAAI,WAAU,cACb;AAAA,0BAAAD,MAAC,SAAI,WAAU,mBACb,0BAAAC,OAAC,SAAI,SAAQ,aAAY,WAAU,oBACjC;AAAA,4BAAAD,MAAC,YAAO,WAAU,qBAAoB,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,QAAO;AAAA,YACzE,gBAAAA,MAAC,UAAK,WAAU,mBAAkB,MAAK,QAAO,GAAE,wBAAuB;AAAA,aACzE,GACF;AAAA,UACA,gBAAAC,OAAC,OAAE,WAAU,mBAAkB;AAAA;AAAA,YAAU,cAAc,YAAY;AAAA,aAAM;AAAA,WAC3E;AAAA,QACA,gBAAAD,MAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,SAAS,SAAS,OAAO,EAAE,WAAW,GAAG,GAAG,kBAEpG;AAAA,SACF,IACE,SAAS,UACX,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,MAAM,QAAQ,MAAM;AAAA,UAC7B;AAAA;AAAA,MACF,IAEA,gBAAAC,OAAAF,WAAA,EACE;AAAA,wBAAAC,MAAC,QAAG,WAAU,kBAAkB,iBAAM;AAAA,QACtC,gBAAAA,MAAC,SAAI,WAAU,UACb,0BAAAC,OAAC,UAAK,UAAU,cAAc,WAAU,WACrC;AAAA,yBACC,gBAAAA,OAAC,WAAM,WAAU,YAAW;AAAA;AAAA,YAE1B,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,gBAClD,aAAY;AAAA,gBACZ,UAAQ;AAAA,gBACR,cAAa;AAAA;AAAA,YACf;AAAA,aACF;AAAA,UAEF,gBAAAC,OAAC,WAAM,WAAU,YAAW;AAAA;AAAA,YAE1B,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,gBAC9C,aAAY;AAAA,gBACZ,UAAQ;AAAA,gBACR,cAAa;AAAA,gBACb,WAAW;AAAA;AAAA,YACb;AAAA,aACF;AAAA,UACC,SAAS,gBAAAA,MAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,UACzC,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,UAAU,SAC/D,oBAAU,cAAc,cAAc,oBAAoB,gBAC7D;AAAA,WACF,GACF;AAAA,SACF;AAAA;AAAA,EAEJ,GACF;AAEJ;;;AE7HA,SAAS,YAAAI,YAAU,aAAAC,kBAAiB;AAsF1B,qBAAAC,WACE,OAAAC,OACA,QAAAC,cAFF;AAzEH,SAAS,mBAAmB,EAAE,QAAQ,SAAS,UAAU,GAA4B;AAC1F,QAAM,EAAE,KAAK,gBAAgB,QAAQ,OAAO,IAAI,gBAAgB;AAChE,QAAM,QAAQ,OAAO,YAAY,SAAS;AAE1C,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAe,SAAS;AAChD,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,EAAE;AACnC,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AAErC,EAAAC,WAAU,MAAM;AACd,QAAI,QAAQ;AACV,cAAQ,SAAS;AACjB,cAAQ,EAAE;AACV,eAAS,EAAE;AACX,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,eAAe,YAAY;AAC/B,aAAS,EAAE;AACX,eAAW,IAAI;AACf,QAAI;AACF,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,EAAE,qBAAqB,IAAI,MAAM,IAAI,uBAAuB,KAAK;AACvE,UAAI,sBAAsB;AACxB,gBAAQ,MAAM;AAAA,MAChB,OAAO;AACL,cAAM,IAAI,uBAAuB,KAAK;AACtC,gBAAQ,MAAM;AAAA,MAChB;AAAA,IACF,SAAS,KAAc;AACrB,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU;AACjD,eAAS,GAAG;AACZ,cAAQ,OAAO;AAAA,IACjB,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,oBAAoB,OAAO,MAAuB;AACtD,MAAE,eAAe;AACjB,aAAS,EAAE;AACX,eAAW,IAAI;AACf,QAAI;AACF,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,uBAAuB,OAAO,IAAI;AAC5C,cAAQ,MAAM;AAAA,IAChB,SAAS,KAAc;AACrB,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU;AACjD,eAAS,GAAG;AACZ,cAAQ,OAAO;AAAA,IACjB,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,WAAO;AACP,cAAU;AAAA,EACZ;AAEA,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,gBAAAH,MAAC,gBAAa,QAAgB,SAAS,SAAS,SAAS,aAAa,SACpE,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,eAAe,OAAO,YAAY,eAAe,UAAU;AAAA,MACpE,cAAY;AAAA,MAEX;AAAA,iBAAS,aACR,gBAAAA,OAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,QAAG,WAAU,kBAAiB,4BAAc;AAAA,UAC7C,gBAAAC,OAAC,SAAI,WAAU,UAAS,OAAO,EAAE,WAAW,SAAS,GACnD;AAAA,4BAAAD,MAAC,OAAE,WAAU,2BAA0B,8GAEvC;AAAA,YACC,SAAS,gBAAAA,MAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,YACzC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,OAAO,EAAE,WAAW,IAAI,YAAY,0BAA0B,OAAO,WAAW,aAAa,yBAAyB;AAAA,gBAErH,oBAAU,kBAAkB;AAAA;AAAA,YAC/B;AAAA,YACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,GAAG,GAC1B,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,SAAS,oBAAM,GACpE;AAAA,aACF;AAAA,WACF;AAAA,QAGD,SAAS,UACR,gBAAAC,OAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,QAAG,WAAU,kBAAiB,kCAAoB;AAAA,UACnD,gBAAAC,OAAC,SAAI,WAAU,UACb;AAAA,4BAAAD,MAAC,OAAE,WAAU,2BAA0B,OAAO,EAAE,WAAW,SAAS,GAAG,4EAEvE;AAAA,YACC,SAAS,gBAAAA,MAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,YACzC,gBAAAC,OAAC,UAAK,UAAU,mBAAmB,WAAU,WAC3C;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,aAAY;AAAA,kBACZ,WAAW;AAAA,kBACX,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAE,CAAC;AAAA,kBAC1D,OAAO,EAAE,WAAW,UAAU,eAAe,QAAQ;AAAA,kBACrD,WAAS;AAAA;AAAA,cACX;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAU,WAAW,KAAK,WAAW;AAAA,kBACrC,OAAO,EAAE,WAAW,IAAI,YAAY,0BAA0B,OAAO,WAAW,aAAa,yBAAyB;AAAA,kBAErH,oBAAU,gBAAgB;AAAA;AAAA,cAC7B;AAAA,eACF;AAAA,YACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,IAAI,WAAW,SAAS,GAC/C,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,SAAS,oBAAM,GACpE;AAAA,aACF;AAAA,WACF;AAAA,QAGD,SAAS,UACR,gBAAAC,OAAC,SAAI,WAAU,UAAS,OAAO,EAAE,WAAW,UAAU,SAAS,SAAS,GACtE;AAAA,0BAAAA,OAAC,SAAI,WAAU,cACb;AAAA,4BAAAD,MAAC,SAAI,WAAU,mBACb,0BAAAC,OAAC,SAAI,SAAQ,aAAY,WAAU,oBACjC;AAAA,8BAAAD,MAAC,YAAO,WAAU,qBAAoB,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,QAAO;AAAA,cACzE,gBAAAA,MAAC,UAAK,WAAU,mBAAkB,MAAK,QAAO,GAAE,wBAAuB;AAAA,eACzE,GACF;AAAA,YACA,gBAAAA,MAAC,OAAE,WAAU,mBAAkB,6BAAe;AAAA,aAChD;AAAA,UACA,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,SAAS,YAAY,OAAO,EAAE,WAAW,GAAG,GAAG,kBAEvG;AAAA,WACF;AAAA,QAGD,SAAS,WACR,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,MAAM,QAAQ,SAAS;AAAA,YAChC;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EAEJ,GACF;AAEJ;;;AtB5HM,gBAAAI,OAkDI,QAAAC,cAlDJ;AAhCN,IAAM,iBAAuE;AAAA,EAC3E,OAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA,iBAAiB;AAAA,IACf,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,iBAAiB,UAAkB;AAE1C,MAAI,YAAY,eAAe;AAC7B,UAAM,OAAO,cAAc,QAAyB;AACpD,WAAO,EAAE,OAAO,KAAK,OAAO,UAAU,KAAK,KAAK;AAAA,EAClD;AACA,SAAO,eAAe,QAAQ,KAAK,EAAE,OAAO,UAAU,UAAU,OAAU;AAC5E;AAEA,SAAS,SAAS,KAAa,MAAM,IAAI;AACvC,MAAI,IAAI,UAAU,IAAK,QAAO;AAC9B,SAAO,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;AAC9C;AAEA,IAAM,eAAe,MACnB,gBAAAD,MAAC,UAAK,WAAU,4BACd,0BAAAA,MAAC,SAAI,SAAQ,aAAY,MAAK,QAC5B,0BAAAA,MAAC,UAAK,GAAE,gBAAe,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GAC9G,GACF;AAKF,IAAM,OAAkD;AAAA,EACtD,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,EACnC,EAAE,KAAK,gBAAgB,OAAO,SAAS;AAAA,EACvC,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,EACnC,EAAE,KAAK,YAAY,OAAO,WAAW;AACvC;AAIO,SAAS,eAAe;AAC7B,QAAM,EAAE,cAAc,mBAAmB,eAAe,WAAW,QAAQ,OAAO,IAAI,gBAAgB;AACtG,QAAM,EAAE,KAAK,IAAI,QAAQ;AACzB,QAAM,CAAC,WAAW,YAAY,IAAIE,WAA0B,SAAS;AAGrE,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,CAAC;AAC9C,QAAM,eAAeC,QAAO,KAAK;AACjC,EAAAC,YAAU,MAAM;AACd,QAAI,aAAa,WAAW,CAAC,UAAU,QAAQ;AAC7C,oBAAc,CAAC,MAAM,IAAI,CAAC;AAAA,IAC5B;AACA,iBAAa,UAAU,UAAU;AAAA,EACnC,GAAG,CAAC,UAAU,MAAM,CAAC;AAErB,MAAI,CAAC,aAAa,OAAQ,QAAO;AAEjC,QAAM,QAAQ,OAAO,YAAY,SAAS;AAC1C,QAAM,WAAW,MAAM,eAAe,MAAM,gBAAgB,KAAK,OAAO,CAAC,EAAE,YAAY;AAEvF,SACE,gBAAAJ,MAAC,gBAAa,QAAQ,aAAa,QAAQ,SAAS,mBAClD,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,eAAe,OAAO,YAAY,eAAe,UAAU;AAAA,MACpE,cAAY;AAAA,MAGZ;AAAA,wBAAAA,OAAC,SAAI,WAAU,mBACZ;AAAA,gBAAM,YACL,gBAAAD,MAAC,SAAI,KAAK,KAAK,WAAW,KAAI,IAAG,WAAU,0BAAyB,IAEpE,gBAAAA,MAAC,UAAK,WAAU,6DAA6D,mBAAQ;AAAA,UAEvF,gBAAAC,OAAC,SAAI,WAAU,wBACb;AAAA,4BAAAD,MAAC,UAAK,WAAU,wBAAwB,gBAAM,eAAe,gBAAe;AAAA,YAC3E,MAAM,gBAAgB,gBAAAA,MAAC,UAAK,WAAU,yBAAyB,eAAK,cAAa;AAAA,aACpF;AAAA,WACF;AAAA,QAGA,gBAAAA,MAAC,SAAI,WAAU,mBACZ,eAAK,IAAI,CAAC,QACT,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAW,iBAAiB,cAAc,IAAI,MAAM,2BAA2B,EAAE;AAAA,YACjF,SAAS,MAAM,aAAa,IAAI,GAAG;AAAA,YAElC,cAAI;AAAA;AAAA,UALA,IAAI;AAAA,QAMX,CACD,GACH;AAAA,QAGC,cAAc,aAAa,gBAAAA,MAAC,cAAW;AAAA,QACvC,cAAc,kBAAkB,gBAAAA,MAAC,aAAU,QAAQ,MAAM,cAAc,MAAM,GAAG,YAAwB;AAAA,QACxG,cAAc,aAAa,gBAAAA,MAAC,cAAW,QAAQ,MAAM,cAAc,QAAQ,GAAG,YAAwB;AAAA,QACtG,cAAc,cAAc,gBAAAA,MAAC,eAAY;AAAA,QAG1C,gBAAAA,MAAC,SAAI,WAAU,qBACb,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM;AAAE,qBAAO;AAAG,gCAAkB;AAAA,YAAG;AAAA,YAEhD;AAAA,8BAAAD,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,0BAAAA,MAAC,UAAK,GAAE,iEAAgE,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAO,GAC9J;AAAA,cAAM;AAAA;AAAA;AAAA,QAER,GACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;AAIA,SAAS,aAAa;AACpB,QAAM,EAAE,MAAM,cAAc,IAAI,QAAQ;AACxC,QAAM,CAAC,aAAa,cAAc,IAAIE,WAAS,MAAM,eAAe,EAAE;AACtE,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,MAAM,aAAa,EAAE;AAChE,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,KAAK,MAAM,IAAIA,WAA+C,IAAI;AAEzE,EAAAE,YAAU,MAAM;AACd,mBAAe,MAAM,eAAe,EAAE;AACtC,iBAAa,MAAM,aAAa,EAAE;AAAA,EACpC,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,aAAa,YAAY;AAC7B,eAAW,IAAI;AACf,WAAO,IAAI;AACX,QAAI;AACF,YAAM,cAAc;AAAA,QAClB,aAAa,eAAe;AAAA,QAC5B,WAAW,aAAa;AAAA,MAC1B,CAAC;AACD,aAAO,EAAE,MAAM,mBAAmB,IAAI,KAAK,CAAC;AAAA,IAC9C,SAAS,KAAc;AACrB,aAAO,EAAE,MAAM,eAAe,QAAQ,IAAI,UAAU,2CAA2C,IAAI,MAAM,CAAC;AAAA,IAC5G,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,gBAAAJ,MAAC,SAAI,WAAU,UACb,0BAAAC,OAAC,SAAI,WAAU,WACb;AAAA,oBAAAA,OAAC,WAAM,WAAU,YAAW;AAAA;AAAA,MAE1B,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,UAC9C,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IACA,gBAAAC,OAAC,WAAM,WAAU,YAAW;AAAA;AAAA,MAE1B,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,UAC5C,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IACA,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,SAAS,YAAY,UAAU,SACpF,oBAAU,cAAc,gBAC3B;AAAA,IACC,OAAO,gBAAAA,MAAC,OAAE,WAAW,IAAI,KAAK,YAAY,YAAa,cAAI,MAAK;AAAA,KACnE,GACF;AAEJ;AAIA,SAAS,UAAU,EAAE,QAAQ,WAAW,GAA+C;AACrF,QAAM,EAAE,aAAa,SAAS,kBAAkB,iBAAiB,IAAI,QAAQ;AAC7E,QAAM,CAAC,KAAK,MAAM,IAAIE,WAAS,EAAE;AAEjC,EAAAE,YAAU,MAAM;AACd,qBAAiB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACnC,GAAG,CAAC,kBAAkB,UAAU,CAAC;AAEjC,QAAM,eAAe,OAAO,OAAe;AACzC,WAAO,EAAE;AACT,QAAI;AACF,YAAM,iBAAiB,EAAE;AAAA,IAC3B,SAAS,KAAc;AACrB,aAAO,eAAe,QAAQ,IAAI,UAAU,yDAAyD;AAAA,IACvG;AAAA,EACF;AAEA,SACE,gBAAAH,OAAC,SAAI,WAAU,UACZ;AAAA,WAAO,gBAAAD,MAAC,OAAE,WAAU,YAAY,eAAI;AAAA,IACpC,WAAW,gBAAAA,MAAC,OAAE,WAAU,WAAU,wBAAU;AAAA,IAC7C,gBAAAA,MAAC,OAAE,WAAU,2BAA0B,mDAAqC;AAAA,IAC3E,aAAa,IAAI,CAAC,MAAM;AACvB,YAAM,UAAU,iBAAiB,EAAE,QAAQ;AAC3C,YAAM,SAAS,EAAE,aAAa,UAC1B,EAAE,aACF,EAAE,SAAS,SAAS,SAAS,IAC3B,SAAS,EAAE,UAAU,IACrB,EAAE,mBACC,EAAE,aAAa,aAAa,EAAE,aAAa,aAAa,IAAI,EAAE,gBAAgB,KAAK,EAAE,mBACtF,SAAS,EAAE,UAAU;AAC7B,aACE,gBAAAC,OAAC,SAAe,WAAU,mBACvB;AAAA,gBAAQ,YACP,gBAAAD,MAAC,WAAQ,KAAK,QAAQ,UAAU,WAAU,wBAAuB;AAAA,QAEnE,gBAAAC,OAAC,SAAI,WAAU,wBACb;AAAA,0BAAAD,MAAC,UAAK,WAAU,yBAAyB,kBAAQ,OAAM;AAAA,UACvD,gBAAAA,MAAC,UAAK,WAAU,0BAA0B,kBAAO;AAAA,WACnD;AAAA,QACA,gBAAAC,OAAC,SAAI,WAAU,2BACZ;AAAA,YAAE,cAAc,gBAAAD,MAAC,UAAK,WAAU,qBAAoB,sBAAQ;AAAA,UAC7D,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,oBAAmB,SAAS,MAAM,aAAa,EAAE,EAAE,GAAG,oBAEtF;AAAA,WACF;AAAA,WAbQ,EAAE,EAcZ;AAAA,IAEJ,CAAC;AAAA,IACA,aAAa,WAAW,KAAK,gBAAAA,MAAC,OAAE,WAAU,oBAAmB,kCAAoB;AAAA,IAClF,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,QAAQ,OAAO,EAAE,WAAW,EAAE,GAAG,gCAEpG;AAAA,KACF;AAEJ;AAIA,SAAS,WAAW,EAAE,QAAQ,WAAW,GAA+C;AACtF,QAAM,EAAE,SAAS,SAAS,cAAc,aAAa,IAAI,WAAW;AACpE,QAAM,CAAC,KAAK,MAAM,IAAIE,WAAS,EAAE;AAEjC,EAAAE,YAAU,MAAM;AACd,iBAAa,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC/B,GAAG,CAAC,cAAc,UAAU,CAAC;AAE7B,QAAM,mBAAmB,OAAO,OAAe;AAC7C,WAAO,EAAE;AACT,QAAI;AACF,YAAM,aAAa,IAAI,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5C,SAAS,KAAc;AACrB,aAAO,eAAe,QAAQ,IAAI,UAAU,iDAAiD;AAAA,IAC/F;AAAA,EACF;AAEA,SACE,gBAAAH,OAAC,SAAI,WAAU,UACZ;AAAA,WAAO,gBAAAD,MAAC,OAAE,WAAU,YAAY,eAAI;AAAA,IACpC,WAAW,gBAAAA,MAAC,OAAE,WAAU,WAAU,wBAAU;AAAA,IAC7C,gBAAAA,MAAC,OAAE,WAAU,2BAA0B,uDAAyC;AAAA,IAC/E,SAAS,IAAI,CAAC,MACb,gBAAAC,OAAC,SAAe,WAAU,mBACxB;AAAA,sBAAAD,MAAC,WAAQ,KAAK,eAAe,GAAG,EAAE,KAAK,SAAS,GAAG,YAAY,IAAI,WAAU,wBAAuB;AAAA,MACpG,gBAAAC,OAAC,SAAI,WAAU,wBACb;AAAA,wBAAAA,OAAC,UAAK,WAAU,yBACb;AAAA,YAAE,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,MAAM,CAAC;AAAA,UACjD,EAAE,aAAa,gBAAAD,MAAC,UAAK,WAAU,oBAAmB,OAAO,EAAE,YAAY,EAAE,GAAG,qBAAO;AAAA,WACtF;AAAA,QACA,gBAAAA,MAAC,UAAK,WAAU,0BAA0B,mBAAS,EAAE,OAAO,GAAE;AAAA,SAChE;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,2BACZ,WAAC,EAAE,aACF,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,qBAAoB,SAAS,MAAM,iBAAiB,EAAE,EAAE,GAAG,0BAE3F,GAEJ;AAAA,SAfQ,EAAE,EAgBZ,CACD;AAAA,IACA,SAAS,WAAW,KAAK,gBAAAA,MAAC,OAAE,WAAU,oBAAmB,kCAAoB;AAAA,IAC9E,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,QAAQ,OAAO,EAAE,WAAW,EAAE,GAAG,8BAEpG;AAAA,KACF;AAEJ;AAIA,SAAS,cAAc;AACrB,QAAM,EAAE,UAAU,SAAS,eAAe,cAAc,IAAI,YAAY;AACxE,QAAM,EAAE,WAAW,QAAQ,mBAAmB,KAAK,eAAe,IAAI,gBAAgB;AACtF,QAAM,EAAE,MAAM,aAAa,iBAAiB,iBAAiB,IAAI,QAAQ;AACzE,QAAM,CAAC,KAAK,MAAM,IAAIE,WAAS,EAAE;AAGjC,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAyB,IAAI;AACnE,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,CAAC;AAGlD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAAS,KAAK;AAC9D,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,WAAS,KAAK;AAChE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAS,KAAK;AAE5D,QAAM,gBAAgBG,aAAY,MAAM;AACtC,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,MAAO;AACZ,QAAI,aAAa,KAAK,EAAE,KAAK,CAAC,MAAM,eAAe,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC/E,GAAG,CAAC,KAAK,cAAc,CAAC;AAExB,QAAM,sBAAsBA,aAAY,MAAM;AAC5C,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,MAAO;AACZ,QAAI,YAAY,KAAK,EAAE,KAAK,CAAC,SAAS,gBAAgB,KAAK,MAAM,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACpF,GAAG,CAAC,KAAK,cAAc,CAAC;AAExB,EAAAD,YAAU,MAAM;AACd,kBAAc,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC9B,qBAAiB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACjC,kBAAc;AACd,wBAAoB;AAAA,EACtB,GAAG,CAAC,eAAe,kBAAkB,eAAe,mBAAmB,CAAC;AAExE,QAAM,cAAc,iBAAiB,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO;AAEvE,QAAM,eAAe,OAAO,OAAe;AACzC,WAAO,EAAE;AACT,QAAI;AACF,YAAM,cAAc,EAAE;AAAA,IACxB,SAAS,KAAc;AACrB,aAAO,eAAe,QAAQ,IAAI,UAAU,oDAAoD;AAAA,IAClG;AAAA,EACF;AAEA,SACE,gBAAAH,OAAC,SAAI,WAAU,UACZ;AAAA,WAAO,gBAAAD,MAAC,OAAE,WAAU,YAAY,eAAI;AAAA,IAGrC,gBAAAC,OAAC,YAAO,MAAK,UAAS,WAAU,oBAAmB,SAAS,MAAM,gBAAgB,IAAI,GACpF;AAAA,sBAAAD,MAAC,UAAK,WAAU,yBACd,0BAAAC,OAAC,SAAI,SAAQ,aAAY,MAAK,QAC5B;AAAA,wBAAAD,MAAC,UAAK,GAAE,oEAAmE,QAAO,gBAAe,aAAY,OAAM,gBAAe,SAAQ;AAAA,QAC1I,gBAAAA,MAAC,UAAK,GAAE,uBAAsB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ;AAAA,SACrH,GACF;AAAA,MACA,gBAAAC,OAAC,UAAK,WAAU,yBACd;AAAA,wBAAAD,MAAC,UAAK,WAAU,0BAAyB,uCAAyB;AAAA,QAClE,gBAAAA,MAAC,UAAK,WAAU,2BACb,0BAAgB,OAAO,eAAe,cAAc,YAAY,eACnE;AAAA,SACF;AAAA,MACA,gBAAAA,MAAC,gBAAa;AAAA,OAChB;AAAA,IAGA,gBAAAC,OAAC,YAAO,MAAK,UAAS,WAAU,oBAAmB,SAAS,MAAM,oBAAoB,IAAI,GACxF;AAAA,sBAAAD,MAAC,UAAK,WAAU,yBACd,0BAAAC,OAAC,SAAI,SAAQ,aAAY,MAAK,QAC5B;AAAA,wBAAAD,MAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,QACpE,gBAAAA,MAAC,UAAK,GAAE,2BAA0B,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,QAChG,gBAAAA,MAAC,UAAK,GAAE,mCAAkC,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ;AAAA,SACjI,GACF;AAAA,MACA,gBAAAC,OAAC,UAAK,WAAU,yBACd;AAAA,wBAAAD,MAAC,UAAK,WAAU,0BAAyB,sBAAQ;AAAA,QACjD,gBAAAA,MAAC,UAAK,WAAU,2BACb,2BAAiB,IAAI,gBAAgB,GAAG,YAAY,WAAW,iBAAiB,IAAI,MAAM,EAAE,IAC/F;AAAA,SACF;AAAA,MACA,gBAAAA,MAAC,gBAAa;AAAA,OAChB;AAAA,IAGC,MAAM,gBACL,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,qBAAqB,IAAI;AAAA,QAExC;AAAA,0BAAAD,MAAC,UAAK,WAAU,yBACd,0BAAAC,OAAC,SAAI,SAAQ,aAAY,MAAK,QAC5B;AAAA,4BAAAD,MAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,KAAI,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,YACvF,gBAAAA,MAAC,UAAK,GAAE,0BAAyB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,aACjG,GACF;AAAA,UACA,gBAAAC,OAAC,UAAK,WAAU,yBACd;AAAA,4BAAAD,MAAC,UAAK,WAAU,0BAAyB,sBAAQ;AAAA,YACjD,gBAAAA,MAAC,UAAK,WAAU,2BACb,wBAAc,yBAAyB,kBAC1C;AAAA,aACF;AAAA,UACA,gBAAAA,MAAC,gBAAa;AAAA;AAAA;AAAA,IAChB;AAAA,IAIF,gBAAAA,MAAC,SAAI,WAAU,cAAa,OAAO,EAAE,QAAQ,SAAS,GAAG,0BAAAA,MAAC,UAAK,6BAAe,GAAO;AAAA,IACpF,WAAW,gBAAAA,MAAC,OAAE,WAAU,WAAU,wBAAU;AAAA,IAC5C,UAAU,IAAI,CAAC,MACd,gBAAAC,OAAC,SAAe,WAAU,mBACxB;AAAA,sBAAAD,MAAC,UAAK,WAAU,wBACd,0BAAAC,OAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD;AAAA,wBAAAD,MAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAK;AAAA,QACvF,gBAAAA,MAAC,UAAK,GAAE,mBAAkB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAO;AAAA,SACzF,GACF;AAAA,MACA,gBAAAC,OAAC,SAAI,WAAU,wBACb;AAAA,wBAAAD,MAAC,UAAK,WAAU,yBACb,YAAE,cAAc,eAAe,EAAE,cAAc,QAC5C,gBACA,SAAS,EAAE,WAAW,EAAE,GAC9B;AAAA,QACA,gBAAAC,OAAC,UAAK,WAAU,0BAAyB;AAAA;AAAA,UAC/B,QAAQ,EAAE,YAAY;AAAA,UAAE;AAAA,UAAY,IAAI,KAAK,EAAE,SAAS,EAAE,mBAAmB;AAAA,WACvF;AAAA,SACF;AAAA,MACA,gBAAAD,MAAC,SAAI,WAAU,2BACb,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,oBAAmB,SAAS,MAAM,aAAa,EAAE,EAAE,GAAG,sBAEtF,GACF;AAAA,SArBQ,EAAE,EAsBZ,CACD;AAAA,IACA,UAAU,WAAW,KAAK,gBAAAA,MAAC,OAAE,WAAU,oBAAmB,gCAAkB;AAAA,IAC5E,YAAY,SAAS,SAAS,KAC7B,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM;AAAE,oBAAU;AAAA,QAAG;AAAA,QAC9B,OAAO,EAAE,WAAW,EAAE;AAAA,QACvB;AAAA;AAAA,IAED;AAAA,IAIF,gBAAAA,MAAC,SAAI,WAAU,cAAa,OAAO,EAAE,QAAQ,SAAS,GAAG,0BAAAA,MAAC,UAAK,yBAAW,GAAO;AAAA,IACjF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,mBAAmB,IAAI;AAAA,QACtC,OAAO,EAAE,YAAY,0BAA0B,OAAO,WAAW,aAAa,yBAAyB;AAAA,QACxG;AAAA;AAAA,IAED;AAAA,IAGA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM;AAAE,0BAAgB,KAAK;AAAG,wBAAc;AAAA,QAAG;AAAA,QAC1D,gBAAgB,eAAe;AAAA,QAC/B,gBAAgB,CAAC,MAAM,eAAe,CAAC;AAAA;AAAA,IACzC;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM;AAAE,8BAAoB,KAAK;AAAG,8BAAoB;AAAA,QAAG;AAAA,QACpE,eAAe,CAAC,UAAU,gBAAgB,KAAK;AAAA;AAAA,IACjD;AAAA,IACC,MAAM,gBACL,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM;AAAE,+BAAqB,KAAK;AAAG,2BAAiB,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QAAG;AAAA,QAClF,aAAa,eAAe;AAAA;AAAA,IAC9B;AAAA,IAEF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM,mBAAmB,KAAK;AAAA,QACvC,WAAW,MAAM;AAAE,iBAAO;AAAG,4BAAkB;AAAA,QAAG;AAAA;AAAA,IACpD;AAAA,KACF;AAEJ;;;AuBpfA,SAAS,YAAAM,YAAU,aAAAC,aAAW,WAAAC,UAAS,UAAAC,SAAQ,eAAAC,oBAAmB;AA0FxD,SASA,YAAAC,WATA,OAAAC,OASA,QAAAC,cATA;AA5EH,SAAS,gBAAgB;AAC9B,QAAM,EAAE,WAAW,gBAAgB,OAAO,IAAI,gBAAgB;AAC9D,QAAM,EAAE,WAAW,YAAY,IAAI,QAAQ;AAC3C,QAAM,OAAO,UAAU,QAAQ;AAC/B,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAmB,eAAe;AAC1D,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,EAAE;AAG/C,EAAAC,YAAU,MAAM;AACd,QAAI,UAAU,QAAQ;AACpB,cAAQ,SAAS,WAAW,WAAW,eAAe;AACtD,oBAAc,EAAE;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,UAAU,QAAQ,IAAI,CAAC;AAG3B,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,UAAU,OAAQ;AAEvB,UAAM,gBAAgB,CAAC,UAAwB;AAC7C,UAAI,MAAM,WAAW,OAAO,SAAS,OAAQ;AAC7C,UAAI,MAAM,MAAM,SAAS,yBAAyB;AAChD,gBAAQ,SAAS;AACjB,mBAAW,MAAM;AACf,sBAAY;AAAA,QACd,GAAG,IAAI;AAAA,MACT;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,UAAU,MAAM,CAAC;AAErB,MAAI,CAAC,UAAU,OAAQ,QAAO;AAE9B,QAAM,QAAQ,OAAO,YAAY,SAAS;AAE1C,QAAM,cAAc,MAAM;AACxB,YAAQ,eAAe;AACvB,mBAAe;AAAA,EACjB;AAEA,QAAM,gBAAgB,MAAM;AAC1B,YAAQ,SAAS;AACjB,eAAW,MAAM;AACf,kBAAY;AAAA,IACd,GAAG,IAAI;AAAA,EACT;AAEA,QAAM,oBAAoB,CAAC,aAAqB;AAC9C,cAAU,QAAQ;AAAA,EACpB;AAEA,QAAM,mBAAmB,CAAC,QAAgB;AACxC,kBAAc,GAAG;AACjB,YAAQ,OAAO;AAAA,EACjB;AAEA,QAAM,QAAQ,SAAS,aAAa,SAAS,UACzC,KACA,SAAS,UACP,eACA,SAAS,QACP,eACA,SAAS,YAAY,SAAS,WAC5B,mBACA;AAEV,SACE,gBAAAH,MAAC,gBAAa,QAAQ,UAAU,QAAQ,SAAS,aAC/C,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,eAAe,OAAO,YAAY,eAAe,UAAU;AAAA,MACpE,cAAY;AAAA,MAEX,mBAAS,YACR,gBAAAA,MAACI,cAAA,EAAY,IACX,SAAS,UACX,gBAAAJ;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,MAAM,QAAQ,SAAS,WAAW,WAAW,eAAe;AAAA,UACrE,SAAS;AAAA;AAAA,MACX,IAEA,gBAAAC,OAAAF,WAAA,EACE;AAAA,wBAAAC,MAAC,QAAG,WAAU,kBAAkB,iBAAM;AAAA,QACrC,SAAS,mBACR,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,oBAAoB,aAAa,IAAI,OAAK,EAAE,QAAQ,KAAK,CAAC;AAAA,YAC1D,eAAe,MAAM,QAAQ,OAAO;AAAA,YACpC,aAAa,MAAM,QAAQ,KAAK;AAAA,YAChC,SAAS;AAAA;AAAA,QACX;AAAA,QAED,SAAS,WACR,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,SAAS,WAAW,SAAY,MAAM,QAAQ,eAAe;AAAA,YACrE,WAAW;AAAA,YACX,cAAc;AAAA;AAAA,QAChB;AAAA,QAED,SAAS,SACR,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,MAAM,QAAQ,eAAe;AAAA,YACrC,WAAW;AAAA,YACX,cAAc;AAAA;AAAA,QAChB;AAAA,QAED,SAAS,YACR,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,SAAS,WAAW,SAAY,MAAM,QAAQ,eAAe;AAAA,YACrE,WAAW;AAAA,YACX,cAAc;AAAA;AAAA,QAChB;AAAA,SAEJ;AAAA;AAAA,EAEJ,GACF;AAEJ;AAIA,IAAMK,aAAY,MAChB,gBAAAL,MAAC,SAAI,WAAU,uBACb,0BAAAC,OAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,WAAU,kBACpE;AAAA,kBAAAD,MAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,EACxF,gBAAAA,MAAC,UAAK,GAAE,gBAAe,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,GACvF,GACF;AAGF,IAAM,gBAAgB,MACpB,gBAAAA,MAAC,SAAI,WAAU,uBACb,0BAAAC,OAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,WAAU,kBACpE;AAAA,kBAAAD,MAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,EACxF,gBAAAA,MAAC,UAAK,GAAE,kCAAiC,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,GACzG,GACF;AAKF,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,UAAU,oBAAoB,MAAM;AAC1C,QAAM,eAAe,IAAI,IAAI,kBAAkB;AAC/C,QAAM,WAAW,aAAa,IAAI,OAAO;AAGzC,QAAM,mBAAmB,QAAQ,OAAO,CAAC,MAAM;AAC7C,QAAI,MAAM,YAAY,MAAM,UAAW,QAAO;AAE9C,QAAI,MAAM,QAAS,QAAO,CAAC;AAC3B,QAAI,MAAM,MAAO,QAAO,CAAC;AACzB,QAAI,cAAc,CAAC,EAAG,QAAO,CAAC,aAAa,IAAI,CAAC;AAChD,WAAO;AAAA,EACT,CAAC;AAED,MAAI,iBAAiB,WAAW,GAAG;AACjC,WACE,gBAAAA,MAAC,SAAI,WAAU,UACb,0BAAAA,MAAC,OAAE,WAAU,WAAU,gEAAkD,GAC3E;AAAA,EAEJ;AAEA,SACE,gBAAAA,MAAC,SAAI,WAAU,UACZ,2BAAiB,IAAI,CAAC,WAAW;AAChC,QAAI,WAAW,SAAS;AACtB,aACE,gBAAAC,OAAC,YAAmB,MAAK,UAAS,WAAU,wBAAuB,SAAS,eAC1E;AAAA,wBAAAD,MAACK,YAAA,EAAU;AAAA,QAAE;AAAA,QAAC,gBAAAL,MAAC,UAAK,WAAU,eAAc,8BAAoB;AAAA,WADtD,OAEZ;AAAA,IAEJ;AAEA,QAAI,WAAW,OAAO;AACpB,aACE,gBAAAC,OAAC,YAAiB,MAAK,UAAS,WAAU,wBAAuB,SAAS,aACxE;AAAA,wBAAAD,MAAC,iBAAc;AAAA,QAAE;AAAA,QAAC,gBAAAA,MAAC,UAAK,WAAU,eAAc,wBAAU;AAAA,WADhD,KAEZ;AAAA,IAEJ;AAGA,UAAM,WAAW;AACjB,UAAM,OAAO,cAAc,QAAQ;AACnC,QAAI,CAAC,KAAM,QAAO;AAElB,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,QAAQ,QAAQ;AAAA,QAE/B;AAAA,0BAAAD,MAAC,WAAQ,KAAK,KAAK,MAAM,WAAU,iBAAgB;AAAA,UACnD,gBAAAA,MAAC,UAAK,WAAU,eAAe,eAAK,OAAM;AAAA;AAAA;AAAA,MANrC;AAAA,IAOP;AAAA,EAEJ,CAAC,GACH;AAEJ;AAIA,SAAS,cAAc,EAAE,QAAQ,WAAW,aAAa,GAAwF;AAC/I,QAAM,EAAE,eAAe,IAAI,QAAQ;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAIE,WAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,EAAE;AAC3C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AAErC,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,eAAW,IAAI;AACf,aAAS,EAAE;AACX,QAAI;AACF,YAAM,eAAe,EAAE,UAAU,SAAS,OAAO,SAAS,CAAC;AAC3D,gBAAU;AAAA,IACZ,SAAS,KAAc;AACrB,mBAAa,eAAe,QAAQ,IAAI,UAAU,8CAA8C;AAAA,IAClG,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,gBAAAD,OAAC,SAAI,WAAU,UACZ;AAAA,aAAS,gBAAAD,MAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,IACzC,gBAAAC,OAAC,UAAK,WAAU,WAAU,UAAU,cAClC;AAAA,sBAAAA,OAAC,WAAM,WAAU,YAAW;AAAA;AAAA,QAE1B,gBAAAD,MAAC,WAAM,WAAU,YAAW,MAAK,SAAQ,OAAO,OAAO,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK,GAAG,UAAQ,MAAC,aAAY,mBAAkB;AAAA,SAC3I;AAAA,MACA,gBAAAC,OAAC,WAAM,WAAU,YAAW;AAAA;AAAA,QAE1B,gBAAAD,MAAC,WAAM,WAAU,YAAW,MAAK,YAAW,OAAO,UAAU,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK,GAAG,UAAQ,MAAC,WAAW,GAAG,aAAY,iBAAgB;AAAA,SAChK;AAAA,MACA,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,UAAU,SAC/D,oBAAU,eAAe,cAC5B;AAAA,OACF;AAAA,IACC,UACC,gBAAAA,MAAC,SAAI,WAAU,aACb,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,QAAQ,kBAAI,GACjE;AAAA,KAEJ;AAEJ;AAIA,SAAS,YAAY,EAAE,QAAQ,WAAW,aAAa,GAAwF;AAC7I,QAAM,EAAE,aAAa,cAAc,IAAI,QAAQ;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIE,WAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,EAAE;AACnC,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,KAAK;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AAErC,QAAM,iBAAiB,OAAO,MAAuB;AACnD,MAAE,eAAe;AACjB,eAAW,IAAI;AACf,aAAS,EAAE;AACX,QAAI;AACF,YAAM,YAAY,KAAK;AACvB,kBAAY,IAAI;AAAA,IAClB,SAAS,KAAc;AACrB,eAAS,eAAe,QAAQ,IAAI,UAAU,wCAAwC;AAAA,IACxF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO,MAAuB;AACrD,MAAE,eAAe;AACjB,eAAW,IAAI;AACf,aAAS,EAAE;AACX,QAAI;AACF,YAAM,cAAc,OAAO,IAAI;AAC/B,gBAAU;AAAA,IACZ,SAAS,KAAc;AACrB,mBAAa,eAAe,QAAQ,IAAI,UAAU,iCAAiC;AAAA,IACrF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,CAAC,UAAU;AACb,WACE,gBAAAD,OAAC,SAAI,WAAU,UACZ;AAAA,eAAS,gBAAAD,MAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,MACzC,gBAAAC,OAAC,UAAK,WAAU,WAAU,UAAU,gBAClC;AAAA,wBAAAA,OAAC,WAAM,WAAU,YAAW;AAAA;AAAA,UAE1B,gBAAAD,MAAC,WAAM,WAAU,YAAW,MAAK,SAAQ,OAAO,OAAO,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK,GAAG,UAAQ,MAAC,aAAY,mBAAkB;AAAA,WAC3I;AAAA,QACA,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,UAAU,SAC/D,oBAAU,eAAe,aAC5B;AAAA,SACF;AAAA,MACC,UACC,gBAAAA,MAAC,SAAI,WAAU,aACb,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,QAAQ,kBAAI,GACjE;AAAA,OAEJ;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,UACb;AAAA,oBAAAA,OAAC,OAAE,WAAU,WAAU;AAAA;AAAA,MAA2B,gBAAAD,MAAC,YAAQ,iBAAM;AAAA,OAAS;AAAA,IACzE,SAAS,gBAAAA,MAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,IACzC,gBAAAC,OAAC,UAAK,WAAU,WAAU,UAAU,kBAClC;AAAA,sBAAAA,OAAC,WAAM,WAAU,YAAW;AAAA;AAAA,QAE1B,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAQ;AAAA,YACR,WAAW;AAAA,YACX,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,YACtE,UAAQ;AAAA,YACR,aAAY;AAAA,YACZ,WAAS;AAAA;AAAA,QACX;AAAA,SACF;AAAA,MACA,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,UAAU,WAAW,KAAK,WAAW,GAC1F,oBAAU,iBAAiB,iBAC9B;AAAA,OACF;AAAA,IACA,gBAAAA,MAAC,SAAI,WAAU,aACb,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,MAAM;AAAE,kBAAY,KAAK;AAAG,cAAQ,EAAE;AAAG,eAAS,EAAE;AAAA,IAAG,GAAG,mCAE7G,GACF;AAAA,KACF;AAEJ;AAIA,SAAS,eAAe,EAAE,QAAQ,WAAW,aAAa,GAAwF;AAChJ,QAAM,EAAE,eAAe,OAAO,IAAI,gBAAgB;AAClD,QAAM,EAAE,WAAW,IAAI,WAAW;AAClC,QAAM,CAAC,SAAS,UAAU,IAAIE,WAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AACrC,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,KAAK;AAClD,QAAM,SAASI,SAAQ,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3C,QAAM,eAAe,OAAO;AAC5B,QAAM,YAAY,cAAc,oBAAoB,CAAC;AACrD,QAAM,gBAAgB,cAAc,iBAAiB;AAErD,QAAM,gBAAgBC,QAAO,UAAU;AACvC,gBAAc,UAAU;AAExB,QAAM,0BAA0BC,aAAY,CAAC,YAAsE;AACjH,QAAI,CAAC,QAAQ,gBAAiB,QAAO;AACrC,UAAM,UAAU,cAAc;AAC9B,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,OAAO,aAAqB;AACjC,YAAM,QAAQ,WAAW,KAAK,KAAK,QAAQ,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACpE,YAAM,KAAK,QAAQ,KAAK,KAAK;AAC7B,YAAM,WAAW,MAAM,QAAQ,gBAAgB,EAAE;AACjD,aAAO,KAAK,OAAO,aAAa,GAAG,IAAI,WAAW,SAAS,UAAU,CAAC,CAAC,CAAC;AAAA,IAC1E;AAAA,EACF,GAAG,CAAC,cAAc,WAAW,CAAC;AAE9B,QAAM,SAAS;AAEf,QAAM,gBAAgB,OAAO,MAAuD;AAClF,QAAI,EAAE,eAAe,aAAa;AAChC,UAAI,QAAQ;AACV,cAAM,KAAK,eAAe,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,IAAI;AAC/D,YAAI,IAAI;AAAE,iBAAO,SAAS,OAAO,GAAG,SAAS,OAAO,SAAS,IAAI;AAAG;AAAA,QAAQ;AAAA,MAC9E;AACA,YAAM,MAAO,EAAE,QAAgB;AAC/B,UAAI,IAAK,QAAO,KAAK,KAAK,QAAQ;AAClC;AAAA,IACF;AAEA,aAAS,EAAE;AACX,eAAW,IAAI;AACf,QAAI;AAEF,aAAO,OAAO,EAAE,QAAQ,IAAI;AAG5B,UAAI,CAAC,EAAE,QAAQ,UAAW,OAAO,EAAE,QAAgB,QAAQ;AAE3D,YAAM,KAAK,EAAE,QAAQ;AACrB,UAAI,CAAC,GAAI,OAAM,IAAI,MAAM,sCAAsC;AAC/D,YAAM,UAAU,cAAc;AAC9B,YAAM,qBAAsB,EAAE,QAAgB,cAC1C,CAAC,QAAqB,EAAE,QAAgB,YAAY,GAAG,IACvD;AACJ,YAAM;AAAA,QACJ,GAAG,SAAS;AAAA,QACZ,UAAU,SAAY;AAAA,QACtB;AAAA,QACA,UAAU,wBAAwB,EAAE,OAAO,IAAI;AAAA,MACjD;AACA,gBAAU;AAAA,IACZ,SAAS,KAAc;AACrB,mBAAa,eAAe,QAAQ,IAAI,UAAU,+CAA+C;AAAA,IACnG;AAAA,EACF;AAEA,QAAM,EAAE,kBAAkB,aAAa,IAAIF,SAAQ,MAAM;AACvD,QAAI,CAAC,cAAe,QAAO,EAAE,kBAAkB,CAAC,GAAY,cAAc,CAAC,EAAW;AACtF,UAAM,MAAM,cAAc;AAC1B,UAAM,WAAW,UACd,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,QAAQ,SAAS,IAAI,CAAC,EACtD,OAAO,OAAO;AACjB,QAAI,iBAAiB,UAAU,SAAS,EAAG,QAAO,EAAE,kBAAkB,UAAU,cAAc,CAAC,EAAgB;AAC/G,UAAM,UAAU,IAAI,IAAI,SAAS;AACjC,UAAM,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,QAAQ,IAAI,KAAK,EAAE,eAAe,WAAW;AAC7F,WAAO,EAAE,kBAAkB,UAAU,cAAc,OAAO;AAAA,EAC5D,GAAG,CAAC,eAAe,SAAS,YAAY,CAAC;AAEzC,QAAM,qBAAqBA,SAAQ,MAAM;AACvC,QAAI,CAAC,UAAU,CAAC,cAAe,QAAO,CAAC;AACvC,UAAM,eAAe,IAAI,IAAI,cAAc,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC;AAC7E,WAAO,eAAe,OAAO,CAAC,OAAO,CAAC,aAAa,IAAI,GAAG,IAAI,CAAC;AAAA,EACjE,GAAG,CAAC,QAAQ,eAAe,OAAO,CAAC;AAGnC,MAAI,CAAC,iBAAiB,QAAQ;AAC5B,WACE,gBAAAL,OAAC,SAAI,WAAU,UACb;AAAA,sBAAAD,MAAC,SAAI,WAAU,kBACZ,yBAAe,IAAI,CAAC,OACnB,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAAqB,MAAK;AAAA,UAAS,WAAU;AAAA,UAC5C,SAAS,MAAM;AAAE,mBAAO,SAAS,OAAO,GAAG,SAAS,OAAO,SAAS,IAAI;AAAA,UAAG;AAAA,UAC3E;AAAA,4BAAAD,MAAC,UAAK,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GAC1D,0BAAAA,MAAC,SAAI,KAAK,GAAG,MAAM,KAAI,IAAG,WAAU,kBAAiB,GACvD;AAAA,YACA,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,aAAG,MAAK;AAAA,YAC1C,gBAAAA,MAAC,UAAK,WAAU,sBAAqB,sBAAQ;AAAA;AAAA;AAAA,QANlC,GAAG;AAAA,MAOhB,CACD,GACH;AAAA,MACC,UACC,gBAAAA,MAAC,SAAI,WAAU,aACb,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,QAAQ,kBAAI,GACjE;AAAA,OAEJ;AAAA,EAEJ;AAGA,MAAI,CAAC,eAAe;AAClB,WACE,gBAAAC,OAAC,SAAI,WAAU,UACb;AAAA,sBAAAA,OAAC,OAAE,WAAU,WAAU;AAAA;AAAA,QACY,gBAAAD,MAAC,UAAK,2BAAa;AAAA,QAAO;AAAA,QAAI;AAAA,QAC/D,gBAAAA,MAAC,UAAK,oCAA4B;AAAA,QAAO;AAAA,SAC3C;AAAA,MACC,UACC,gBAAAA,MAAC,SAAI,WAAU,aACb,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,QAAQ,kBAAI,GACjE;AAAA,OAEJ;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,UACZ;AAAA,cACC,gBAAAA,OAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,SAAS,GACnD;AAAA,sBAAAD,MAAC,OAAE,WAAU,gBAAe,2BAAa;AAAA,MACzC,gBAAAA,MAAC,OAAE,WAAU,WACV,uBACG,2CACA,6EACN;AAAA,MACC,SACC,gBAAAC,OAAAF,WAAA,EACE;AAAA,wBAAAC,MAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,QAC/B,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAAO,MAAK;AAAA,YAAS,WAAU;AAAA,YAC9B,SAAS,MAAM;AAAE,yBAAW,KAAK;AAAG,uBAAS,EAAE;AAAA,YAAG;AAAA,YAAG,OAAO,EAAE,WAAW,EAAE;AAAA,YAAG;AAAA;AAAA,QAEhF;AAAA,SACF;AAAA,OAEJ,IAEA,gBAAAC,OAAAF,WAAA,EACE;AAAA,sBAAAE,OAAC,SAAI,WAAU,kBACZ;AAAA,yBAAiB,IAAI,CAAC,MAAW;AAChC,gBAAM,YAAY,EAAE,eAAe;AACnC,iBACE,gBAAAA,OAAC,YAA4B,MAAK,UAAS,WAAU,wBAAuB,SAAS,MAAM,cAAc,CAAC,GACxG;AAAA,4BAAAD,MAAC,UAAK,WAAW,YAAY,qBAAqB,IAAI,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GAC1G,0BAAAA,MAAC,SAAI,KAAK,EAAE,QAAQ,MAAM,KAAI,IAAG,WAAU,kBAAiB,GAC9D;AAAA,YACA,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,YAAE,QAAQ,MAAK;AAAA,YACjD,gBAAAA,MAAC,UAAK,WAAU,sBAAqB,uBAAS;AAAA,YAC7C,CAAC,aAAa,UAAU,eAAe,KAAK,CAAC,OAAO,GAAG,SAAS,EAAE,QAAQ,IAAI,IAC3E,gBAAAA,MAAC,UAAK,WAAU,oBAAmB,sBAAQ,IAC3C,CAAC,aAAa,gBAAAA,MAAC,UAAK,WAAU,oBAAmB,qBAAO;AAAA,eARjD,EAAE,QAAQ,IAUvB;AAAA,QAEJ,CAAC;AAAA,QACA,mBAAmB,IAAI,CAAC,OACvB,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAAqB,MAAK;AAAA,YAAS,WAAU;AAAA,YAC5C,SAAS,MAAM;AAAE,qBAAO,SAAS,OAAO,GAAG,SAAS,OAAO,SAAS,IAAI;AAAA,YAAG;AAAA,YAC3E;AAAA,8BAAAD,MAAC,UAAK,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GAC1D,0BAAAA,MAAC,SAAI,KAAK,GAAG,MAAM,KAAI,IAAG,WAAU,kBAAiB,GACvD;AAAA,cACA,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,aAAG,MAAK;AAAA,cAC1C,gBAAAA,MAAC,UAAK,WAAU,oBAAmB,sBAAQ;AAAA;AAAA;AAAA,UANhC,GAAG;AAAA,QAOhB,CACD;AAAA,QACA,aAAa,SAAS,KAAK,CAAC,aAC3B,gBAAAC,OAAC,YAAO,MAAK,UAAS,WAAU,wBAAuB,SAAS,MAAM,aAAa,IAAI,GACrF;AAAA,0BAAAD,MAAC,UAAK,WAAU,yBACd,0BAAAC,OAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD;AAAA,4BAAAD,MAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,YACxF,gBAAAA,MAAC,UAAK,GAAE,WAAU,QAAO,gBAAe,aAAY,OAAM;AAAA,YAC1D,gBAAAA,MAAC,UAAK,GAAE,MAAK,GAAE,MAAK,OAAM,KAAI,QAAO,KAAI,IAAG,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,aAC1F,GACF;AAAA,UACA,gBAAAA,MAAC,UAAK,WAAU,kBAAiB,2BAAa;AAAA,WAChD;AAAA,QAED,aAAa,aAAa,IAAI,CAAC,MAC9B,gBAAAC,OAAC,YAA4B,MAAK,UAAS,WAAU,wBAAuB,SAAS,MAAM,cAAc,CAAC,GACxG;AAAA,0BAAAD,MAAC,UAAK,WAAU,oBAAmB,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GACvF,0BAAAA,MAAC,SAAI,KAAK,EAAE,QAAQ,MAAM,KAAI,IAAG,WAAU,kBAAiB,GAC9D;AAAA,UACA,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,YAAE,QAAQ,MAAK;AAAA,aAJtC,EAAE,QAAQ,IAKvB,CACD;AAAA,SACH;AAAA,MACC,iBAAiB,WAAW,KAAK,aAAa,WAAW,KAAK,mBAAmB,WAAW,KAC3F,gBAAAA,MAAC,OAAE,WAAU,WAAU,yFAA2E;AAAA,MAGnG,cAAc,eACb,gBAAAC,OAAC,WAAM,WAAU,yBACf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,OAAO;AAAA;AAAA,QACjD;AAAA,QACA,gBAAAA,MAAC,UAAK,WAAU,mBAAkB;AAAA,QAClC,gBAAAC,OAAC,UAAK,WAAU,wBACd;AAAA,0BAAAD,MAAC,UAAK,6BAAe;AAAA,UACrB,gBAAAA,MAAC,UAAK,yCAA2B;AAAA,WACnC;AAAA,SACF;AAAA,MAGD,SAAS,gBAAAA,MAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,OAC3C;AAAA,IAED,CAAC,WAAW,UACX,gBAAAA,MAAC,SAAI,WAAU,aACb,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,QAAQ,kBAAI,GACjE;AAAA,KAEJ;AAEJ;AAIA,SAASI,eAAc;AACrB,SACE,gBAAAH,OAAC,SAAI,WAAU,cACb;AAAA,oBAAAD,MAAC,SAAI,WAAU,mBACb,0BAAAC,OAAC,SAAI,SAAQ,aAAY,WAAU,oBACjC;AAAA,sBAAAD,MAAC,YAAO,WAAU,qBAAoB,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,QAAO;AAAA,MACzE,gBAAAA,MAAC,UAAK,WAAU,mBAAkB,MAAK,QAAO,GAAE,wBAAuB;AAAA,OACzE,GACF;AAAA,IACA,gBAAAA,MAAC,OAAE,WAAU,mBAAkB,oBAAM;AAAA,KACvC;AAEJ;;;AtChCI,SAEE,OAAAS,OAFF,QAAAC,cAAA;AA1jBJ,IAAM,qBAAqB,oBAAI,IAAiD;AAazE,SAAS,qBAAqB,EAAE,QAAQ,UAAU,SAAS,UAAU,cAAc,GAA8B;AACtH,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAoB;AAAA,IAC1C,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf,CAAC;AAED,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAqB;AAAA,IAC7C,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AAED,QAAM,CAAC,cAAc,eAAe,IAAIA,WAA4B,EAAE,QAAQ,MAAM,CAAC;AACrF,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAyB,EAAE,QAAQ,MAAM,CAAC;AAC5E,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAwB,IAAI;AACxE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAStC,IAAI;AAEd,QAAM,SAASC,QAAO,gBAAgB,OAAO,MAAM,CAAC;AACpD,QAAM,kBAAkBA,QAA6C,IAAI;AAEzE,QAAM,MAAM,OAAO;AAInB,QAAM,kBAAkBC,aAAY,CAAC,UAAkB;AACrD,QAAI,gBAAgB,QAAS,cAAa,gBAAgB,OAAO;AACjE,UAAM,QAAQ,gBAAgB,KAAK;AACnC,QAAI,UAAU,KAAM;AAEpB,oBAAgB,UAAU,WAAW,YAAY;AAC/C,UAAI;AACF,cAAM,EAAE,YAAY,IAAI,MAAM,IAAI,QAAQ;AAC1C,gBAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,YAAY,EAAE;AAC5C,wBAAgB,WAAW;AAAA,MAC7B,QAAQ;AAEN,gBAAQ,EAAE,QAAQ,mBAAmB,MAAM,MAAM,aAAa,KAAK,CAAC;AAAA,MACtE;AAAA,IACF,GAAG,KAAK;AAAA,EACV,GAAG,CAAC,GAAG,CAAC;AAIR,EAAAC,YAAU,MAAM;AACd,UAAM,OAAO,YAAY;AACvB,UAAI;AACF,cAAM,EAAE,YAAY,IAAI,MAAM,IAAI,QAAQ;AAC1C,cAAM,OAAO,MAAM,IAAI,MAAM,WAAW;AACxC,gBAAQ,EAAE,QAAQ,iBAAiB,MAAM,YAAY,CAAC;AACtD,wBAAgB,WAAW;AAAA,MAC7B,QAAQ;AACN,gBAAQ,EAAE,QAAQ,mBAAmB,MAAM,MAAM,aAAa,KAAK,CAAC;AAAA,MACtE;AAAA,IACF;AACA,SAAK;AAEL,WAAO,MAAM;AACX,UAAI,gBAAgB,QAAS,cAAa,gBAAgB,OAAO;AAAA,IACnE;AAAA,EACF,GAAG,CAAC,KAAK,eAAe,CAAC;AAIzB,EAAAA,YAAU,MAAM;AAEd,QAAI,OAAO,SAAS,aAAa,sBAAsB;AACrD,YAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAGzD,UAAI,OAAO,IAAI,iBAAiB,KAAK,OAAO,QAAQ;AAClD,eAAO,OAAO;AAAA,UACZ,EAAE,MAAM,yBAAyB,UAAU,OAAO,IAAI,aAAa,EAAE;AAAA,UACrE,OAAO,SAAS;AAAA,QAClB;AACA,eAAO,MAAM;AACb;AAAA,MACF;AAGA,YAAM,iBAAiB,OAAO,IAAI,cAAc;AAChD,UAAI,gBAAgB;AAClB,YAAI;AACF,uBAAa,QAAQ,gCAAgC,cAAc;AAAA,QACrE,QAAQ;AAAA,QAAe;AACvB,YAAI,OAAO,QAAQ;AACjB,iBAAO,OAAO;AAAA,YACZ,EAAE,MAAM,wBAAwB,OAAO,eAAe;AAAA,YACtD,OAAO,SAAS;AAAA,UAClB;AAAA,QACF;AACA,eAAO,MAAM;AACb;AAAA,MACF;AAGA,YAAM,WAAW,OAAO,IAAI,SAAS;AACrC,UAAI,UAAU;AAIZ,YAAI;AACF,uBAAa,QAAQ,yBAAyB,QAAQ;AAAA,QACxD,QAAQ;AAAA,QAER;AACA,YAAI,OAAO,QAAQ;AACjB,iBAAO,OAAO;AAAA,YACZ,EAAE,MAAM,iBAAiB,MAAM,SAAS;AAAA,YACxC,OAAO,SAAS;AAAA,UAClB;AAAA,QACF;AACA,eAAO,MAAM;AACb;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,OAAO,SAAiB;AAEzC,UAAI,kBAAkB,mBAAmB,IAAI,IAAI;AACjD,UAAI,CAAC,iBAAiB;AACpB,YAAI;AACF,uBAAa,WAAW,uBAAuB;AAAA,QACjD,QAAQ;AAAA,QAAe;AACvB,2BAAmB,YAAiD;AAClE,cAAI;AACF,kBAAM,SAAS,MAAM,IAAI,kBAAkB,IAAI;AAC/C,gBAAI,OAAO,eAAe,OAAO,gBAAgB;AAC/C,qBAAO,EAAE,MAAM,eAAe,gBAAgB,OAAO,eAAe;AAAA,YACtE;AACA,kBAAM,QAAQ,OAAO;AACrB,gBAAI,CAAC,MAAO,QAAO;AACnB,kBAAM,OAAO,MAAM,IAAI,MAAM,KAAK;AAClC,mBAAO,EAAE,MAAM,iBAAiB,aAAa,OAAO,KAAK;AAAA,UAC3D,QAAQ;AACN,mBAAO;AAAA,UACT;AAAA,QACF,GAAG;AACH,2BAAmB,IAAI,MAAM,eAAe;AAAA,MAC9C;AAEA,YAAM,UAAU,MAAM;AACtB,UAAI,CAAC,QAAS;AAEd,UAAI,QAAQ,SAAS,eAAe;AAClC,0BAAkB,QAAQ,cAAc;AACxC,iBAAS,EAAE,QAAQ,MAAM,MAAM,aAAa,CAAC;AAC7C;AAAA,MACF;AAEA,eAAS,EAAE,QAAQ,MAAM,MAAM,UAAU,CAAC;AAC1C,cAAQ,EAAE,QAAQ,iBAAiB,MAAM,QAAQ,MAAM,aAAa,QAAQ,YAAY,CAAC;AACzF,sBAAgB,QAAQ,WAAW;AACnC,gBAAU,QAAQ,IAAI;AACtB,iBAAW,MAAM;AACf,iBAAS,EAAE,QAAQ,OAAO,MAAM,gBAAgB,CAAC;AAAA,MACnD,GAAG,IAAI;AAAA,IACT;AAEA,UAAM,uBAAuB,OAAO,UAAkB;AACpD,UAAI;AACF,qBAAa,WAAW,8BAA8B;AAAA,MACxD,QAAQ;AAAA,MAAe;AACvB,UAAI;AACF,cAAM,UAAU,MAAM,IAAI,oBAAoB,KAAK;AACnD,4BAAoB,EAAE,OAAO,GAAG,QAAQ,CAAC;AACzC,iBAAS,EAAE,QAAQ,MAAM,MAAM,oBAAoB,CAAC;AAAA,MACtD,QAAQ;AACN,iBAAS,EAAE,QAAQ,MAAM,MAAM,QAAQ,CAAC;AAAA,MAC1C;AAAA,IACF;AAGA,UAAM,gBAAgB,CAAC,UAAwB;AAC7C,UAAI,MAAM,WAAW,OAAO,SAAS,OAAQ;AAC7C,UAAI,MAAM,MAAM,SAAS,iBAAiB;AACxC,cAAM,OAAO,MAAM,KAAK;AACxB,YAAI,KAAM,MAAK,WAAW,IAAI;AAC9B;AAAA,MACF;AACA,UAAI,MAAM,MAAM,SAAS,wBAAwB;AAC/C,cAAM,QAAQ,MAAM,KAAK;AACzB,YAAI,MAAO,MAAK,qBAAqB,KAAK;AAAA,MAC5C;AAAA,IACF;AAGA,UAAM,gBAAgB,CAAC,UAAwB;AAC7C,UAAI,MAAM,QAAQ,2BAA2B,MAAM,UAAU;AAC3D,aAAK,WAAW,MAAM,QAAQ;AAC9B;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,kCAAkC,MAAM,UAAU;AAClE,aAAK,qBAAqB,MAAM,QAAQ;AAAA,MAC1C;AAAA,IACF;AAGA,QAAI;AACF,YAAM,UAAU,aAAa,QAAQ,uBAAuB;AAC5D,UAAI,QAAS,MAAK,WAAW,OAAO;AACpC,YAAM,mBAAmB,aAAa,QAAQ,8BAA8B;AAC5E,UAAI,iBAAkB,MAAK,qBAAqB,gBAAgB;AAAA,IAClE,QAAQ;AAAA,IAAe;AAEvB,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM;AACX,aAAO,oBAAoB,WAAW,aAAa;AACnD,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,KAAK,OAAO,QAAQ,iBAAiB,OAAO,CAAC;AAIjD,EAAAA,YAAU,MAAM;AACd,QAAI,OAAO,gBAAgB,OAAO,aAAa,SAAS,GAAG;AACzD,YAAM,YAAY,OAAO,kBAAkB,OAAO,gBAAgB,UAAa,OAAO,sBAAsB;AAC5G,UAAI,WAAW;AACb,gBAAQ;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAIL,QAAM,oBAAoBD;AAAA,IACxB,OAAO,UAAkB;AACvB,YAAM,OAAO,MAAM,IAAI,MAAM,KAAK;AAClC,cAAQ,EAAE,QAAQ,iBAAiB,MAAM,aAAa,MAAM,CAAC;AAC7D,sBAAgB,KAAK;AAErB,eAAS,EAAE,QAAQ,MAAM,MAAM,UAAU,CAAC;AAC1C,gBAAU,IAAI;AACd,iBAAW,MAAM;AACf,iBAAS,EAAE,QAAQ,OAAO,MAAM,gBAAgB,CAAC;AAAA,MACnD,GAAG,IAAI;AAAA,IACT;AAAA,IACA,CAAC,KAAK,iBAAiB,OAAO;AAAA,EAChC;AAEA,QAAM,iBAAiBA;AAAA,IACrB,OAAO,OAAe,aAAqB;AACzC,YAAM,MAAM,MAAM,IAAI,MAAM,OAAO,QAAQ;AAC3C,UAAI,IAAI,aAAa;AACnB,0BAAkB,IAAI,cAAe;AACrC,iBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,aAAa,EAAE;AACpD;AAAA,MACF;AACA,YAAM,kBAAkB,IAAI,WAAY;AAAA,IAC1C;AAAA,IACA,CAAC,KAAK,iBAAiB;AAAA,EACzB;AAEA,QAAM,WAAWA;AAAA,IACf,OAAO,OAAe,UAAkB,gBAAyB;AAC/D,YAAM,IAAI,SAAS,OAAO,UAAU,WAAW;AAAA,IAEjD;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,QAAM,UAAUA;AAAA,IACd,OAAO,UAAkB;AACvB,YAAM,IAAI,QAAQ,KAAK;AAAA,IACzB;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,QAAM,YAAYA;AAAA,IAChB,OAAO,OAAe,SAAiB;AACrC,YAAM,MAAM,MAAM,IAAI,UAAU,OAAO,IAAI;AAC3C,UAAI,IAAI,aAAa;AACnB,0BAAkB,IAAI,cAAe;AACrC,iBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,aAAa,EAAE;AACpD;AAAA,MACF;AACA,YAAM,kBAAkB,IAAI,WAAY;AAAA,IAC1C;AAAA,IACA,CAAC,KAAK,iBAAiB;AAAA,EACzB;AAEA,QAAM,kBAAkBA;AAAA,IACtB,OACE,eACA,aACA,QAAgB,UAChB,oBACG;AAEH,UAAI,aAAa;AACf,cAAM,EAAE,aAAAE,cAAa,SAAS,iBAAiB,IAAI,MAAM,IAAI,gBAAgB,eAAe,KAAK;AACjG,cAAM,UAAU,IAAI,YAAY,EAAE,OAAO,gBAAgB;AACzD,cAAM,iBAAiB,MAAM,YAAY,OAAO;AAChD,cAAM,YAAY,UAAU,WACxB,mBAAmB,cAAc,IACjC,MAAM,KAAK,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAClF,cAAMC,OAAM,MAAM,IAAI,aAAaD,cAAa,WAAW,aAAa;AACxE,YAAIC,KAAI,aAAa;AACnB,4BAAkBA,KAAI,cAAe;AACrC,mBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,aAAa,EAAE;AACpD;AAAA,QACF;AACA,cAAM,kBAAkBA,KAAI,WAAY;AACxC;AAAA,MACF;AAGA,UAAI,CAAC,iBAAiB;AACpB,cAAM,IAAI,MAAM,iEAAiE;AAAA,MACnF;AAEA,YAAM,EAAE,aAAa,aAAa,SAAS,IAAI,MAAM,IAAI,kBAAkB,eAAe,KAAK;AAC/F,YAAM,iBAAiB,MAAM,gBAAgB,QAAQ;AAErD,YAAM,MAAM,MAAM,IAAI,eAAe,aAAa,gBAAgB,aAAa;AAC/E,UAAI,IAAI,aAAa;AACnB,0BAAkB,IAAI,cAAe;AACrC,iBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,aAAa,EAAE;AACpD;AAAA,MACF;AACA,YAAM,kBAAkB,IAAI,WAAY;AAAA,IAC1C;AAAA,IACA,CAAC,KAAK,iBAAiB;AAAA,EACzB;AAEA,QAAM,iBAAiBH;AAAA,IACrB,CAAC,aAAqB;AACpB,YAAM,cAAc,GAAG,OAAO,MAAM,eAAe,QAAQ;AAC3D,YAAM,cAAc,mBAAmB,OAAO,SAAS,SAAS,oBAAoB;AACpF,YAAM,MAAM,GAAG,WAAW,iBAAiB,WAAW;AACtD,YAAM,QAAQ;AACd,YAAM,SAAS;AACf,YAAM,OAAO,OAAO,WAAW,OAAO,aAAa,SAAS;AAC5D,YAAM,MAAM,OAAO,WAAW,OAAO,cAAc,UAAU;AAC7D,YAAM,QAAQ,OAAO,KAAK,KAAK,YAAY,SAAS,KAAK,WAAW,MAAM,SAAS,IAAI,QAAQ,GAAG,EAAE;AACpG,eAAS,EAAE,QAAQ,MAAM,MAAM,QAAQ,CAAC;AAGxC,UAAI,OAAO;AACT,cAAM,OAAO,YAAY,MAAM;AAC7B,cAAI,MAAM,QAAQ;AAChB,0BAAc,IAAI;AAClB,qBAAS,CAAC,SAAS,KAAK,SAAS,UAAU,EAAE,QAAQ,MAAM,MAAM,gBAAgB,IAAI,IAAI;AAAA,UAC3F;AAAA,QACF,GAAG,GAAG;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,OAAO,MAAM;AAAA,EAChB;AAEA,QAAM,SAASA,aAAY,YAAY;AACrC,UAAM,QAAQ,KAAK;AACnB,QAAI,gBAAgB,QAAS,cAAa,gBAAgB,OAAO;AACjE,YAAQ,EAAE,QAAQ,mBAAmB,MAAM,MAAM,aAAa,KAAK,CAAC;AACpE,eAAW;AACX,QAAI,OAAO;AACT,UAAI;AACF,cAAM,IAAI,OAAO,KAAK;AAAA,MACxB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,aAAa,KAAK,QAAQ,CAAC;AAEpC,QAAM,iBAAiBA;AAAA,IACrB,OAAO,UAAkB;AACvB,YAAM,IAAI,eAAe,KAAK;AAAA,IAChC;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,QAAM,gBAAgBA;AAAA,IACpB,OAAO,OAAe,aAAqB;AACzC,YAAM,IAAI,cAAc,OAAO,QAAQ;AAAA,IACzC;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,QAAM,mBAAmBA;AAAA,IACvB,OAAO,UAAkB;AACvB,YAAM,MAAM,MAAM,IAAI,iBAAiB,KAAK;AAC5C,UAAI,IAAI,aAAa;AACnB,0BAAkB,IAAI,cAAe;AACrC,iBAAS,EAAE,QAAQ,MAAM,MAAM,aAAa,CAAC;AAC7C;AAAA,MACF;AACA,YAAM,kBAAkB,IAAI,WAAY;AAAA,IAC1C;AAAA,IACA,CAAC,KAAK,iBAAiB;AAAA,EACzB;AAEA,QAAM,mBAAmBA,aAAY,YAAY;AAC/C,UAAM,EAAE,SAAS,aAAa,IAAI,MAAM,IAAI,uBAAuB,OAAO,YAAY;AACtF,UAAM,eAAe,MAAM,oBAAoB,EAAE,aAAa,QAAQ,CAAC;AACvE,UAAM,EAAE,YAAY,IAAI,MAAM,IAAI,mBAAmB,cAAc,cAAc,OAAO,cAAc,OAAO,cAAc;AAC3H,UAAM,kBAAkB,WAAW;AAAA,EACrC,GAAG,CAAC,KAAK,mBAAmB,OAAO,cAAc,OAAO,cAAc,CAAC;AAEvE,QAAM,YAAYA,aAAY,OAAO,SAAiB;AACpD,QAAI,CAAC,eAAgB,OAAM,IAAI,MAAM,yBAAyB;AAC9D,UAAM,EAAE,YAAY,IAAI,MAAM,IAAI,UAAU,gBAAgB,IAAI;AAChE,sBAAkB,IAAI;AACtB,UAAM,kBAAkB,WAAW;AAAA,EACrC,GAAG,CAAC,KAAK,gBAAgB,iBAAiB,CAAC;AAE3C,QAAM,qBAAqBA,aAAY,OAAO,SAAiB;AAC7D,QAAI,CAAC,eAAgB,OAAM,IAAI,MAAM,yBAAyB;AAC9D,UAAM,EAAE,YAAY,IAAI,MAAM,IAAI,mBAAmB,gBAAgB,IAAI;AACzE,sBAAkB,IAAI;AACtB,UAAM,kBAAkB,WAAW;AAAA,EACrC,GAAG,CAAC,KAAK,gBAAgB,iBAAiB,CAAC;AAE3C,QAAM,YAAYA,aAAY,YAAY;AACxC,UAAM,QAAQ,KAAK;AACnB,QAAI,gBAAgB,QAAS,cAAa,gBAAgB,OAAO;AACjE,YAAQ,EAAE,QAAQ,mBAAmB,MAAM,MAAM,aAAa,KAAK,CAAC;AACpE,eAAW;AACX,QAAI,OAAO;AACT,UAAI;AACF,cAAM,IAAI,UAAU,KAAK;AAAA,MAC3B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,aAAa,KAAK,QAAQ,CAAC;AAIpC,QAAM,YAAYA,aAAY,MAAM;AAClC,UAAM,UAAU,oBAAoB,MAAM;AAG1C,QAAI,QAAQ,WAAW,KAAK,cAAc,QAAQ,CAAC,CAAC,GAAG;AACrD,qBAAe,QAAQ,CAAC,CAAC;AACzB;AAAA,IACF;AAGA,QAAI,OAAO,sBAAsB,cAAc,OAAO,kBAAkB,KAAK,QAAQ,SAAS,OAAO,kBAAkB,GAAG;AACxH,qBAAe,OAAO,kBAAkB;AACxC;AAAA,IACF;AAEA,UAAM,OAAO,mBAAmB,QAAQ,OAAO;AAC/C,aAAS,EAAE,QAAQ,MAAM,KAAK,CAAC;AAAA,EACjC,GAAG,CAAC,QAAQ,cAAc,CAAC;AAE3B,QAAM,aAAaA,aAAY,MAAM;AACnC,aAAS,EAAE,QAAQ,OAAO,MAAM,gBAAgB,CAAC;AAAA,EACnD,GAAG,CAAC,CAAC;AAEL,QAAM,eAAeA,aAAY,CAAC,SAAoB;AACpD,aAAS,CAAC,UAAU,EAAE,GAAG,MAAM,KAAK,EAAE;AAAA,EACxC,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmBA,aAAY,MAAM;AACzC,oBAAgB,EAAE,QAAQ,KAAK,CAAC;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA,aAAY,MAAM;AAC1C,oBAAgB,EAAE,QAAQ,MAAM,CAAC;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgBA,aAAY,CAAC,SAA6B;AAC9D,iBAAa,EAAE,QAAQ,MAAM,MAAM,QAAQ,OAAO,CAAC;AAAA,EACrD,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiBA,aAAY,MAAM;AACvC,iBAAa,EAAE,QAAQ,MAAM,CAAC;AAAA,EAChC,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiBA,aAAY,MAAM,KAAK,aAAa,CAAC,KAAK,WAAW,CAAC;AAE7E,QAAM,0BAA0BA,aAAY,OAAO,YAAqB;AACtE,QAAI,CAAC,iBAAkB;AACvB,UAAM,MAAM,MAAM,IAAI,wBAAwB,iBAAiB,OAAO,OAAO;AAC7E,wBAAoB,IAAI;AAGxB,QAAI,cAAc,IAAI,eAAe;AACrC,QAAI,cAAc,IAAI;AACtB,QAAI,YAAY,IAAI;AAEpB,QAAI,IAAI,MAAM;AACZ,YAAM,WAAW,MAAM,IAAI,kBAAkB,IAAI,IAAI;AACrD,oBAAc,SAAS,eAAe;AACtC,oBAAc,SAAS;AACvB,kBAAY,SAAS;AAAA,IACvB;AAEA,QAAI,eAAe,WAAW;AAC5B,wBAAkB,SAAS;AAC3B,eAAS,EAAE,QAAQ,MAAM,MAAM,aAAa,CAAC;AAC7C;AAAA,IACF;AACA,QAAI,aAAa;AACf,YAAM,kBAAkB,WAAW;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,KAAK,kBAAkB,iBAAiB,CAAC;AAI7C,QAAM,QAAkCI,SAAQ,OAAO;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,iBAAiB;AAAA,EAClC,IAAI;AAAA,IACF;AAAA,IAAM;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAK;AAAA,IAAgB;AAAA,IAAc;AAAA,IACxD;AAAA,IAAgB;AAAA,IAAU;AAAA,IAAS;AAAA,IAAW;AAAA,IAC9C;AAAA,IAAgB;AAAA,IAAkB;AAAA,IAAQ;AAAA,IAAW;AAAA,IACrD;AAAA,IAAe;AAAA,IAAkB;AAAA,IAAW;AAAA,IAC5C;AAAA,IAAkB;AAAA,IAClB;AAAA,IAAW;AAAA,IAAY;AAAA,IAAc;AAAA,IAAkB;AAAA,IACvD;AAAA,IAAe;AAAA,IAAgB;AAAA,IAAgB;AAAA,EACjD,CAAC;AAED,SACE,gBAAAP,OAAC,oBAAoB,UAApB,EAA6B,OAC3B;AAAA;AAAA,IACD,gBAAAD,MAAC,cAAW;AAAA,IACZ,gBAAAA,MAAC,gBAAa;AAAA,IACd,gBAAAA,MAAC,iBAAc;AAAA,KACjB;AAEJ;;;AuCvkBM,gBAAAS,aAAA;AALC,SAAS,YAAY,EAAE,WAAW,MAAM,GAAqB;AAClE,QAAM,EAAE,MAAM,WAAW,OAAO,IAAI,gBAAgB;AAEpD,MAAI,KAAK,WAAW,WAAW;AAC7B,WACE,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAW,aAAa,uBAAuB,UAAQ,MAAC,wBAE9E;AAAA,EAEJ;AAEA,MAAI,KAAK,WAAW,iBAAiB;AACnC,WACE,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAW,aAAa,uBAAuB,SAAS,QAC3E,mBAAS,WACZ;AAAA,EAEJ;AAEA,SACE,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAW,aAAa,uBAAuB,SAAS,WAC3E,mBAAS,WACZ;AAEJ;;;AClBM,gBAAAC,OAWA,QAAAC,cAXA;AALC,SAAS,cAAc,EAAE,WAAW,YAAY,QAAQ,GAAuB;AACpF,QAAM,EAAE,MAAM,WAAW,iBAAiB,IAAI,gBAAgB;AAE9D,MAAI,KAAK,WAAW,WAAW;AAC7B,WACE,gBAAAD,MAAC,YAAO,MAAK,UAAS,WAAW,aAAa,uBAAuB,UAAQ,MAAC,wBAE9E;AAAA,EAEJ;AAEA,MAAI,KAAK,WAAW,mBAAmB,KAAK,MAAM;AAChD,UAAM,OAAO,KAAK;AAClB,UAAM,WAAW,KAAK,eAAe,KAAK,gBAAgB,KAAK,OAAO,CAAC,EAAE,YAAY;AAErF,WACE,gBAAAC,OAAC,YAAO,MAAK,UAAS,WAAW,aAAa,kBAAkB,SAAS,kBACtE;AAAA,WAAK,YACJ,gBAAAD,MAAC,SAAI,KAAK,KAAK,WAAW,KAAI,IAAG,WAAU,qBAAoB,IAE/D,gBAAAA,MAAC,UAAK,WAAU,iCAAiC,mBAAQ;AAAA,MAE1D,CAAC,WACA,gBAAAA,MAAC,UAAM,eAAK,eAAe,KAAK,gBAAgB,WAAU;AAAA,OAE9D;AAAA,EAEJ;AAEA,SACE,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAW,aAAa,uBAAuB,SAAS,WAC3E,wBAAc,WACjB;AAEJ;;;AC1CA,SAAS,YAAAE,YAAU,eAAAC,qBAAmB;AAI/B,SAAS,WAAW;AACzB,QAAM,EAAE,KAAK,eAAe,IAAI,gBAAgB;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAyC,IAAI;AACvE,QAAM,CAAC,cAAc,eAAe,IAAIA,WAA2B,IAAI;AACvE,QAAM,CAAC,cAAc,eAAe,IAAIA,WAA2B,IAAI;AACvE,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAE5C,QAAM,YAAYC;AAAA,IAChB,OAAO,WAAgE;AACrE,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,OAAO,MAAM,IAAI,eAAe,OAAO,MAAM;AACnD,iBAAS,IAAI;AACb,eAAO;AAAA,MACT,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,QAAM,UAAUA;AAAA,IACd,OAAO,OAAe;AACpB,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,OAAO,MAAM,IAAI,aAAa,OAAO,EAAE;AAC7C,wBAAgB,IAAI;AACpB,eAAO;AAAA,MACT,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,QAAM,mBAAmBA;AAAA,IACvB,OAAO,IAAY,WAAuB;AACxC,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,sBAAsB,OAAO,IAAI,MAAM;AAEjD,UAAI,cAAc,OAAO,IAAI;AAC3B,cAAM,QAAQ,EAAE;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,KAAK,gBAAgB,cAAc,IAAI,OAAO;AAAA,EACjD;AAEA,QAAM,kBAAkBA;AAAA,IACtB,OAAO,OAAe;AACpB,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,OAAO,MAAM,IAAI,qBAAqB,OAAO,EAAE;AACrD,wBAAgB,IAAI;AACpB,eAAO;AAAA,MACT,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,QAAM,qBAAqBA;AAAA,IACzB,OAAO,OAAe;AACpB,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,wBAAwB,OAAO,EAAE;AAC3C,sBAAgB,CAAC,CAAC;AAAA,IACpB;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC7FA,SAAS,YAAAC,YAAU,eAAAC,qBAAmB;AAI/B,SAAS,WAAW;AACzB,QAAM,EAAE,KAAK,eAAe,IAAI,gBAAgB;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAwB,IAAI;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAsB,IAAI;AAClE,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA,WAAsC,IAAI;AAChG,QAAM,CAAC,WAAW,YAAY,IAAIA,WAA4B,IAAI;AAClE,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,WAAmC,IAAI;AACzF,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAmB,CAAC,CAAC;AAC/D,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAE5C,QAAM,YAAYC;AAAA,IAChB,OAAO,aAAsB;AAC3B,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,OAAO,MAAM,IAAI,eAAe,OAAO,QAAQ;AACrD,iBAAS,KAAK,IAAI;AAClB,eAAO,KAAK;AAAA,MACd,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,QAAM,eAAeA;AAAA,IACnB,OAAO,OAAe;AACpB,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,OAAO,MAAM,IAAI,kBAAkB,OAAO,EAAE;AAClD,mBAAa,KAAK,IAAI;AACtB,aAAO,KAAK;AAAA,IACd;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,QAAM,UAAUA;AAAA,IACd,OAAO,OAAe;AACpB,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,OAAO,MAAM,IAAI,aAAa,OAAO,EAAE;AAC7C,wBAAgB,IAAI;AAEpB,qBAAa,EAAE,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAC/B,eAAO;AAAA,MACT,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,KAAK,gBAAgB,YAAY;AAAA,EACpC;AAEA,QAAM,aAAaA;AAAA,IACjB,OAAO,SAA2F;AAChG,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,OAAO,MAAM,IAAI,gBAAgB,OAAO,IAAI;AAElD,YAAM,UAAU,KAAK,QAAQ;AAC7B,aAAO;AAAA,IACT;AAAA,IACA,CAAC,KAAK,gBAAgB,SAAS;AAAA,EACjC;AAEA,QAAM,aAAaA;AAAA,IACjB,OAAO,IAAY,SAA0E;AAC3F,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,OAAO,MAAM,IAAI,gBAAgB,OAAO,IAAI,IAAI;AACtD,sBAAgB,IAAI;AACpB,aAAO;AAAA,IACT;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,QAAM,aAAaA;AAAA,IACjB,OAAO,OAAe;AACpB,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,gBAAgB,OAAO,EAAE;AACnC,UAAI,cAAc,OAAO,GAAI,iBAAgB,IAAI;AAAA,IACnD;AAAA,IACA,CAAC,KAAK,gBAAgB,cAAc,EAAE;AAAA,EACxC;AAEA,QAAM,iBAAiBA;AAAA,IACrB,YAAY;AACV,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,OAAO,MAAM,IAAI,oBAAoB,KAAK;AAChD,2BAAqB,KAAK,OAAO;AACjC,aAAO,KAAK;AAAA,IACd;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAGA,QAAM,aAAaA;AAAA,IACjB,OAAO,aAAsB;AAC3B,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,OAAO,MAAM,IAAI,WAAW,OAAO,QAAQ;AACjD,+BAAuB,KAAK,IAAI;AAChC,yBAAiB,KAAK,eAAe,CAAC,CAAC;AACvC,eAAO;AAAA,MACT,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,QAAM,eAAeA;AAAA,IACnB,OAAO,QAAgB,aAAsB;AAC3C,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,OAAO,MAAM,IAAI,kBAAkB,OAAO,QAAQ,QAAQ;AAChE,+BAAuB,KAAK,IAAI;AAChC,eAAO,KAAK;AAAA,MACd,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,QAAM,aAAaA;AAAA,IACjB,OAAO,QAAgB,QAAgB,aAAsB;AAC3D,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,gBAAgB,OAAO,QAAQ,QAAQ,QAAQ;AAAA,IAC3D;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,QAAM,aAAaA;AAAA,IACjB,OAAO,QAAgB,QAAgB,aAAsB;AAC3D,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6BAA6B;AACzD,YAAM,IAAI,gBAAgB,OAAO,QAAQ,QAAQ,QAAQ;AAAA,IAC3D;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,EACtB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACzKO,SAAS,cAAc,UAAkB,SAA4B;AAC1E,aAAW,KAAK,SAAS;AACvB,QAAI,MAAM,IAAK,QAAO;AACtB,QAAI,MAAM,SAAU,QAAO;AAC3B,QAAI,EAAE,SAAS,IAAI,GAAG;AACpB,YAAM,UAAU,EAAE,MAAM,GAAG,EAAE;AAC7B,YAAM,UAAU,SAAS,MAAM,GAAG,EAAE,CAAC;AACrC,UAAI,YAAY,QAAS,QAAO;AAAA,IAClC;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,UAAoB,SAA4B;AAChF,SAAO,SAAS,MAAM,OAAK,cAAc,GAAG,OAAO,CAAC;AACtD;AAGO,SAAS,iBAAiB,UAAoB,SAA4B;AAC/E,SAAO,SAAS,KAAK,OAAK,cAAc,GAAG,OAAO,CAAC;AACrD;","names":["useState","useCallback","useEffect","useRef","useMemo","useState","jsx","jsxs","useState","useRef","jsx","jsxs","useState","useRef","useState","useRef","useRef","useEffect","jsx","jsx","jsxs","jsx","jsxs","useState","useRef","useState","jsx","jsxs","useState","useState","useRef","useEffect","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","Fragment","jsx","jsxs","useState","truncate","useState","useEffect","useRef","useCallback","useState","useCallback","useEffect","useRef","useState","useRef","useCallback","useEffect","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect","useState","useEffect","useCallback","jsx","jsxs","useState","useCallback","useEffect","useState","useEffect","jsx","jsxs","Fragment","jsx","jsxs","useState","useEffect","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useRef","useEffect","useCallback","useState","useEffect","useMemo","useRef","useCallback","Fragment","jsx","jsxs","useState","useEffect","SuccessView","EmailIcon","useMemo","useRef","useCallback","jsx","jsxs","useState","useRef","useCallback","useEffect","challengeId","res","useMemo","jsx","jsx","jsxs","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback"]}