spaark-payapi-sdk 1.0.1 → 1.2.0
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.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/{react-pjDvSSJA.d.mts → react-ByYFxpk4.d.mts} +37 -8
- package/dist/{react-pjDvSSJA.d.ts → react-ByYFxpk4.d.ts} +37 -8
- package/dist/react.d.mts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js +2 -2
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +2 -2
- package/dist/react.mjs.map +1 -1
- package/package.json +47 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/config.ts","../src/constants/errors.ts","../src/core/errors.ts","../src/config.ts","../src/core/retry.ts","../src/core/http-client.ts","../src/core/logger.ts","../src/constants/correspondents.ts","../src/modules/transactions.ts","../src/modules/products.ts","../src/modules/webhooks.ts","../src/modules/utils.ts","../src/modules/finances.ts","../src/sdk.ts","../src/react.tsx"],"names":["DEFAULT_CONFIG","ERROR_CODES","ERROR_MAPPINGS","getErrorMapping","pawapayCode","m","PawapayError","_PawapayError","message","code","statusCode","options","originalError","mapping","configSchema","z","resolveConfig","config","result","errors","e","validated","baseUrl","getConfigFromEnv","env","envValue","timeout","retries","level","DEFAULT_RETRY_CONFIG","sleep","ms","resolve","calculateDelay","attempt","delay","jitter","withRetry","operation","logger","resolvedConfig","lastError","error","isNetworkError","msg","HttpClient","_HttpClient","axios","response","status","data","errorData","url","LOG_LEVELS","Logger","prefix","item","sanitized","sensitiveKeys","key","value","sk","formatted","CORRESPONDENTS","CORRESPONDENT_INFO","DEFAULT_LIMITS","depositRequestSchema","payoutRequestSchema","paymentPageRequestSchema","refundRequestSchema","TransactionsModule","httpClient","request","pawapayRequest","depositId","payoutId","transactionId","err","interval","maxAttempts","onStatusChange","lastStatus","filters","params","deposit","payout","productCreateSchema","domainAddSchema","ProductsModule","id","now","product","productId","p","updates","updatedProduct","domain","domainIndex","stored","WebhooksModule","secret","payload","signature","expectedSignature","createHmac","signatureBuffer","expectedBuffer","timingSafeEqual","event","eventType","UtilsModule","uuidv4","uuidValidate","uuidVersion","phoneNumber","correspondent","country","provider","currency","defaults","availability","depositStatus","op","payoutStatus","isOperational","isDelayed","isClosed","phone","countryCode","cleaned","info","statementRequestSchema","FinancesModule","statementId","SpaarkPayApiSdk","mergedConfig","createMockDepositResponse","txId","createMockPayoutResponse","createMockStatusResponse","createMockAvailabilityResponse","createMockPredictResponse","createMockActiveConfigResponse","createMockWalletBalancesResponse","createMockPublicKeysResponse","simulateDelay","generateUUID","c","r","PROVIDER_OPTIONS","CURRENCY_OPTIONS","PawapayTestDashboard","initialApiKey","initialEnvironment","className","initialDemoMode","apiBasePath","onDepositComplete","onPayoutComplete","onError","apiKey","setApiKey","useState","environment","setEnvironment","isConfigured","setIsConfigured","isDemoMode","setIsDemoMode","activeTab","setActiveTab","setPhoneNumber","amount","setAmount","setCurrency","setProvider","description","setDescription","setTransactionId","results","setResults","currentStatus","setCurrentStatus","addResult","useCallback","prev","handleConfigure","handleDemoMode","handleDeposit","res","handlePayout","handleCheckStatus","handleGetAvailability","handlePredictProvider","handleGetActiveConfig","handleGetPublicKeys","handleGetWalletBalances","copyToClipboard","text","jsxs","jsx","SettingsIcon","WalletIcon","PhoneIcon","RefreshIcon","ToolkitIcon","ChartIcon","LoaderIcon","PlayIcon","CopyIcon","SearchIcon","SignalIcon","KeyIcon","CheckIcon","XIcon","BeakerIcon"],"mappings":"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","file":"index.js","sourcesContent":["export type Environment = 'sandbox' | 'production';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\nexport interface SpaarkPayApiSdkConfig {\n apiKey: string;\n environment: Environment;\n baseUrl?: string;\n callbackUrl?: string;\n timeout?: number;\n retries?: number;\n retryDelay?: number;\n logLevel?: LogLevel;\n}\n\nexport interface ResolvedConfig {\n apiKey: string;\n environment: Environment;\n baseUrl: string;\n callbackUrl?: string;\n timeout: number;\n retries: number;\n retryDelay: number;\n logLevel: LogLevel;\n}\n\nexport const DEFAULT_CONFIG = {\n timeout: 30000,\n retries: 3,\n retryDelay: 1000,\n logLevel: 'info' as LogLevel,\n sandboxUrl: 'https://api.sandbox.pawapay.io',\n productionUrl: 'https://api.pawapay.io',\n} as const;\n","export const ERROR_CODES = {\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n INVALID_PHONE: 'INVALID_PHONE',\n INSUFFICIENT_FUNDS: 'INSUFFICIENT_FUNDS',\n AMOUNT_TOO_LOW: 'AMOUNT_TOO_LOW',\n AMOUNT_TOO_HIGH: 'AMOUNT_TOO_HIGH',\n LIMIT_EXCEEDED: 'LIMIT_EXCEEDED',\n DUPLICATE: 'DUPLICATE',\n MMO_UNAVAILABLE: 'MMO_UNAVAILABLE',\n TIMEOUT: 'TIMEOUT',\n UNAUTHORIZED: 'UNAUTHORIZED',\n RATE_LIMITED: 'RATE_LIMITED',\n SERVER_ERROR: 'SERVER_ERROR',\n NETWORK_ERROR: 'NETWORK_ERROR',\n NOT_FOUND: 'NOT_FOUND',\n REFUND_NOT_ALLOWED: 'REFUND_NOT_ALLOWED',\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport interface ErrorMapping {\n pawapayCode: string;\n sdkCode: ErrorCode;\n httpStatus: number;\n retryable: boolean;\n message: string;\n}\n\nexport const ERROR_MAPPINGS: ErrorMapping[] = [\n {\n pawapayCode: 'INVALID_PHONE_NUMBER',\n sdkCode: ERROR_CODES.INVALID_PHONE,\n httpStatus: 400,\n retryable: false,\n message: 'Invalid phone number format',\n },\n {\n pawapayCode: 'INSUFFICIENT_FUNDS',\n sdkCode: ERROR_CODES.INSUFFICIENT_FUNDS,\n httpStatus: 402,\n retryable: false,\n message: 'Insufficient funds in account',\n },\n {\n pawapayCode: 'AMOUNT_TOO_LOW',\n sdkCode: ERROR_CODES.AMOUNT_TOO_LOW,\n httpStatus: 400,\n retryable: false,\n message: 'Amount below minimum',\n },\n {\n pawapayCode: 'AMOUNT_TOO_HIGH',\n sdkCode: ERROR_CODES.AMOUNT_TOO_HIGH,\n httpStatus: 400,\n retryable: false,\n message: 'Amount exceeds maximum',\n },\n {\n pawapayCode: 'TRANSACTION_LIMIT_EXCEEDED',\n sdkCode: ERROR_CODES.LIMIT_EXCEEDED,\n httpStatus: 400,\n retryable: false,\n message: 'Daily or monthly limit exceeded',\n },\n {\n pawapayCode: 'DUPLICATE_TRANSACTION',\n sdkCode: ERROR_CODES.DUPLICATE,\n httpStatus: 409,\n retryable: false,\n message: 'Transaction ID already used',\n },\n {\n pawapayCode: 'CORRESPONDENT_UNAVAILABLE',\n sdkCode: ERROR_CODES.MMO_UNAVAILABLE,\n httpStatus: 503,\n retryable: true,\n message: 'Mobile Money operator temporarily unavailable',\n },\n {\n pawapayCode: 'CORRESPONDENT_TEMPORARILY_UNAVAILABLE',\n sdkCode: ERROR_CODES.MMO_UNAVAILABLE,\n httpStatus: 503,\n retryable: true,\n message: 'Mobile Money operator temporarily unavailable',\n },\n {\n pawapayCode: 'TIMEOUT',\n sdkCode: ERROR_CODES.TIMEOUT,\n httpStatus: 408,\n retryable: true,\n message: 'Transaction timed out',\n },\n {\n pawapayCode: 'INVALID_API_KEY',\n sdkCode: ERROR_CODES.UNAUTHORIZED,\n httpStatus: 401,\n retryable: false,\n message: 'Invalid or expired API key',\n },\n {\n pawapayCode: 'RATE_LIMIT_EXCEEDED',\n sdkCode: ERROR_CODES.RATE_LIMITED,\n httpStatus: 429,\n retryable: true,\n message: 'Too many requests',\n },\n {\n pawapayCode: 'INTERNAL_ERROR',\n sdkCode: ERROR_CODES.SERVER_ERROR,\n httpStatus: 500,\n retryable: true,\n message: 'Pawapay internal error',\n },\n {\n pawapayCode: 'REFUND_NOT_ALLOWED',\n sdkCode: ERROR_CODES.REFUND_NOT_ALLOWED,\n httpStatus: 400,\n retryable: false,\n message: 'Refund not allowed for this transaction',\n },\n];\n\nexport function getErrorMapping(pawapayCode: string): ErrorMapping | undefined {\n return ERROR_MAPPINGS.find((m) => m.pawapayCode === pawapayCode);\n}\n","import type { FailureReason } from '../types/transactions';\nimport { ERROR_CODES, type ErrorCode, getErrorMapping } from '../constants/errors';\n\nexport class PawapayError extends Error {\n readonly code: ErrorCode;\n readonly statusCode: number;\n readonly failureReason?: FailureReason;\n readonly retryable: boolean;\n readonly originalError?: Error;\n\n constructor(\n message: string,\n code: ErrorCode,\n statusCode: number,\n options?: {\n failureReason?: FailureReason;\n retryable?: boolean;\n originalError?: Error;\n }\n ) {\n super(message);\n this.name = 'PawapayError';\n this.code = code;\n this.statusCode = statusCode;\n this.failureReason = options?.failureReason;\n this.retryable = options?.retryable ?? false;\n this.originalError = options?.originalError;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PawapayError);\n }\n }\n\n static fromPawapayResponse(\n pawapayCode: string,\n message?: string,\n originalError?: Error\n ): PawapayError {\n const mapping = getErrorMapping(pawapayCode);\n\n if (mapping) {\n return new PawapayError(\n message ?? mapping.message,\n mapping.sdkCode,\n mapping.httpStatus,\n {\n retryable: mapping.retryable,\n originalError,\n }\n );\n }\n\n return new PawapayError(\n message ?? 'Unknown error occurred',\n ERROR_CODES.SERVER_ERROR,\n 500,\n {\n retryable: false,\n originalError,\n }\n );\n }\n\n static validation(message: string): PawapayError {\n return new PawapayError(message, ERROR_CODES.VALIDATION_ERROR, 400, {\n retryable: false,\n });\n }\n\n static network(message: string, originalError?: Error): PawapayError {\n return new PawapayError(message, ERROR_CODES.NETWORK_ERROR, 0, {\n retryable: true,\n originalError,\n });\n }\n\n static timeout(message: string = 'Request timed out'): PawapayError {\n return new PawapayError(message, ERROR_CODES.TIMEOUT, 408, {\n retryable: true,\n });\n }\n\n static unauthorized(message: string = 'Invalid or expired API key'): PawapayError {\n return new PawapayError(message, ERROR_CODES.UNAUTHORIZED, 401, {\n retryable: false,\n });\n }\n\n static notFound(message: string = 'Resource not found'): PawapayError {\n return new PawapayError(message, ERROR_CODES.NOT_FOUND, 404, {\n retryable: false,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n failureReason: this.failureReason,\n retryable: this.retryable,\n };\n }\n}\n","import { z } from 'zod';\nimport type { SpaarkPayApiSdkConfig, ResolvedConfig, LogLevel } from './types/config';\nimport { DEFAULT_CONFIG } from './types/config';\nimport { PawapayError } from './core/errors';\n\nconst configSchema = z.object({\n apiKey: z.string().min(1, 'API key is required'),\n environment: z.enum(['sandbox', 'production']),\n baseUrl: z.string().url().optional(),\n callbackUrl: z.string().url().optional(),\n timeout: z.number().positive().max(600000).optional(),\n retries: z.number().int().min(0).max(10).optional(),\n retryDelay: z.number().positive().max(60000).optional(),\n logLevel: z.enum(['debug', 'info', 'warn', 'error', 'none']).optional(),\n});\n\nexport function resolveConfig(config: SpaarkPayApiSdkConfig): ResolvedConfig {\n const result = configSchema.safeParse(config);\n\n if (!result.success) {\n const errors = result.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`);\n throw PawapayError.validation(`Invalid SDK configuration: ${errors.join(', ')}`);\n }\n\n const validated = result.data;\n\n const baseUrl =\n validated.baseUrl ??\n (validated.environment === 'production'\n ? DEFAULT_CONFIG.productionUrl\n : DEFAULT_CONFIG.sandboxUrl);\n\n return {\n apiKey: validated.apiKey,\n environment: validated.environment,\n baseUrl,\n callbackUrl: validated.callbackUrl,\n timeout: validated.timeout ?? DEFAULT_CONFIG.timeout,\n retries: validated.retries ?? DEFAULT_CONFIG.retries,\n retryDelay: validated.retryDelay ?? DEFAULT_CONFIG.retryDelay,\n logLevel: validated.logLevel ?? DEFAULT_CONFIG.logLevel,\n };\n}\n\nexport function getConfigFromEnv(): Partial<SpaarkPayApiSdkConfig> {\n const env = typeof process !== 'undefined' ? process.env : {};\n\n const config: Partial<SpaarkPayApiSdkConfig> = {};\n\n if (env['PAWAPAY_API_KEY']) {\n config.apiKey = env['PAWAPAY_API_KEY'];\n }\n\n if (env['PAWAPAY_ENVIRONMENT']) {\n const envValue = env['PAWAPAY_ENVIRONMENT'].toLowerCase();\n if (envValue === 'production' || envValue === 'sandbox') {\n config.environment = envValue;\n }\n }\n\n if (env['PAWAPAY_BASE_URL']) {\n config.baseUrl = env['PAWAPAY_BASE_URL'];\n }\n\n if (env['PAWAPAY_CALLBACK_URL']) {\n config.callbackUrl = env['PAWAPAY_CALLBACK_URL'];\n }\n\n if (env['PAWAPAY_TIMEOUT']) {\n const timeout = parseInt(env['PAWAPAY_TIMEOUT'], 10);\n if (!isNaN(timeout)) {\n config.timeout = timeout;\n }\n }\n\n if (env['PAWAPAY_RETRIES']) {\n const retries = parseInt(env['PAWAPAY_RETRIES'], 10);\n if (!isNaN(retries)) {\n config.retries = retries;\n }\n }\n\n if (env['PAWAPAY_LOG_LEVEL']) {\n const level = env['PAWAPAY_LOG_LEVEL'].toLowerCase() as LogLevel;\n if (['debug', 'info', 'warn', 'error', 'none'].includes(level)) {\n config.logLevel = level;\n }\n }\n\n return config;\n}\n","import { Logger } from './logger';\nimport { PawapayError } from './errors';\n\nexport interface RetryConfig {\n maxAttempts: number;\n initialDelay: number;\n maxDelay?: number;\n backoffMultiplier?: number;\n}\n\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n maxAttempts: 3,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffMultiplier: 2,\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction calculateDelay(attempt: number, config: Required<RetryConfig>): number {\n const delay = config.initialDelay * Math.pow(config.backoffMultiplier, attempt - 1);\n const jitter = Math.random() * 0.3 * delay;\n return Math.min(delay + jitter, config.maxDelay);\n}\n\nexport async function withRetry<T>(\n operation: () => Promise<T>,\n config: Partial<RetryConfig> = {},\n logger?: Logger\n): Promise<T> {\n const resolvedConfig: Required<RetryConfig> = {\n ...DEFAULT_RETRY_CONFIG,\n ...config,\n };\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= resolvedConfig.maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n const isRetryable =\n error instanceof PawapayError\n ? error.retryable\n : isNetworkError(error);\n\n if (!isRetryable || attempt === resolvedConfig.maxAttempts) {\n throw error;\n }\n\n const delay = calculateDelay(attempt, resolvedConfig);\n\n logger?.warn(\n `Attempt ${attempt}/${resolvedConfig.maxAttempts} failed, retrying in ${Math.round(delay)}ms`,\n { error: lastError.message }\n );\n\n await sleep(delay);\n }\n }\n\n throw lastError ?? new Error('Retry failed without error');\n}\n\nfunction isNetworkError(error: unknown): boolean {\n if (error instanceof PawapayError) {\n return error.retryable;\n }\n\n if (error instanceof Error) {\n const networkErrorMessages = [\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'ETIMEDOUT',\n 'ENOTFOUND',\n 'Network Error',\n 'timeout',\n 'socket hang up',\n ];\n\n return networkErrorMessages.some(\n (msg) =>\n error.message.includes(msg) ||\n (error as NodeJS.ErrnoException).code === msg\n );\n }\n\n return false;\n}\n","import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport axios from 'axios';\nimport type { ResolvedConfig } from '../types/config';\nimport { PawapayError } from './errors';\nimport { Logger } from './logger';\nimport { withRetry } from './retry';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout: number;\n retries: number;\n retryDelay: number;\n logger: Logger;\n}\n\ninterface PawapayErrorResponse {\n errorId?: string;\n errorCode?: string;\n errorMessage?: string;\n rejectionReason?: {\n rejectionCode?: string;\n rejectionMessage?: string;\n };\n}\n\nexport class HttpClient {\n private readonly client: AxiosInstance;\n private readonly logger: Logger;\n private readonly retries: number;\n private readonly retryDelay: number;\n\n constructor(config: HttpClientConfig) {\n this.logger = config.logger;\n this.retries = config.retries;\n this.retryDelay = config.retryDelay;\n\n this.client = axios.create({\n baseURL: config.baseUrl,\n timeout: config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.apiKey}`,\n },\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n this.client.interceptors.request.use(\n (config) => {\n this.logger.debug(`${config.method?.toUpperCase()} ${config.url}`, {\n params: config.params,\n });\n return config;\n },\n (error: unknown) => {\n this.logger.error('Request error', error);\n return Promise.reject(error);\n }\n );\n\n this.client.interceptors.response.use(\n (response) => {\n this.logger.debug(\n `${response.config.method?.toUpperCase()} ${response.config.url} -> ${response.status}`,\n { data: response.data }\n );\n return response;\n },\n (error: unknown) => {\n if (axios.isAxiosError(error)) {\n this.logger.error(\n `Request failed: ${error.config?.method?.toUpperCase()} ${error.config?.url}`,\n {\n status: error.response?.status,\n data: error.response?.data,\n }\n );\n }\n return Promise.reject(error);\n }\n );\n }\n\n private handleError(error: unknown): never {\n if (axios.isAxiosError(error)) {\n if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {\n throw PawapayError.timeout();\n }\n\n if (!error.response) {\n throw PawapayError.network(\n error.message || 'Network error',\n error\n );\n }\n\n const { status, data } = error.response;\n const errorData = data as PawapayErrorResponse | undefined;\n\n if (status === 401) {\n throw PawapayError.unauthorized();\n }\n\n if (status === 404) {\n throw PawapayError.notFound();\n }\n\n const pawapayCode =\n errorData?.errorCode ??\n errorData?.rejectionReason?.rejectionCode;\n\n if (pawapayCode) {\n throw PawapayError.fromPawapayResponse(\n pawapayCode,\n errorData?.errorMessage ?? errorData?.rejectionReason?.rejectionMessage,\n error\n );\n }\n\n throw new PawapayError(\n errorData?.errorMessage ?? `HTTP error ${status}`,\n 'SERVER_ERROR',\n status,\n {\n retryable: status >= 500,\n originalError: error,\n }\n );\n }\n\n if (error instanceof PawapayError) {\n throw error;\n }\n\n throw PawapayError.network(\n error instanceof Error ? error.message : 'Unknown error',\n error instanceof Error ? error : undefined\n );\n }\n\n async get<T>(url: string, config?: AxiosRequestConfig): Promise<T> {\n return withRetry(\n async () => {\n try {\n const response: AxiosResponse<T> = await this.client.get(url, config);\n return response.data;\n } catch (error) {\n this.handleError(error);\n }\n },\n { maxAttempts: this.retries, initialDelay: this.retryDelay },\n this.logger\n );\n }\n\n async post<T, D = unknown>(url: string, data?: D, config?: AxiosRequestConfig): Promise<T> {\n return withRetry(\n async () => {\n try {\n const response: AxiosResponse<T> = await this.client.post(url, data, config);\n return response.data;\n } catch (error) {\n this.handleError(error);\n }\n },\n { maxAttempts: this.retries, initialDelay: this.retryDelay },\n this.logger\n );\n }\n\n async put<T, D = unknown>(url: string, data?: D, config?: AxiosRequestConfig): Promise<T> {\n return withRetry(\n async () => {\n try {\n const response: AxiosResponse<T> = await this.client.put(url, data, config);\n return response.data;\n } catch (error) {\n this.handleError(error);\n }\n },\n { maxAttempts: this.retries, initialDelay: this.retryDelay },\n this.logger\n );\n }\n\n async delete<T>(url: string, config?: AxiosRequestConfig): Promise<T> {\n return withRetry(\n async () => {\n try {\n const response: AxiosResponse<T> = await this.client.delete(url, config);\n return response.data;\n } catch (error) {\n this.handleError(error);\n }\n },\n { maxAttempts: this.retries, initialDelay: this.retryDelay },\n this.logger\n );\n }\n\n static fromConfig(config: ResolvedConfig, logger: Logger): HttpClient {\n return new HttpClient({\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n timeout: config.timeout,\n retries: config.retries,\n retryDelay: config.retryDelay,\n logger,\n });\n }\n}\n","import type { LogLevel } from '../types/config';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nexport class Logger {\n private readonly prefix: string;\n private level: LogLevel;\n\n constructor(prefix: string, level: LogLevel = 'info') {\n this.prefix = prefix;\n this.level = level;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n private shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\n }\n\n private formatMessage(level: string, message: string): string {\n const timestamp = new Date().toISOString();\n return `[${timestamp}] ${level.toUpperCase().padEnd(5)} [${this.prefix}] ${message}`;\n }\n\n private sanitize(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (typeof data === 'string') {\n return data;\n }\n\n if (typeof data !== 'object') {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map((item) => this.sanitize(item));\n }\n\n const sanitized: Record<string, unknown> = {};\n const sensitiveKeys = ['apiKey', 'api_key', 'authorization', 'password', 'secret', 'token'];\n\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n if (sensitiveKeys.some((sk) => key.toLowerCase().includes(sk))) {\n sanitized[key] = '[REDACTED]';\n } else if (typeof value === 'object' && value !== null) {\n sanitized[key] = this.sanitize(value);\n } else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n }\n\n debug(message: string, data?: unknown): void {\n if (this.shouldLog('debug')) {\n const formatted = this.formatMessage('debug', message);\n if (data !== undefined) {\n console.debug(formatted, this.sanitize(data));\n } else {\n console.debug(formatted);\n }\n }\n }\n\n info(message: string, data?: unknown): void {\n if (this.shouldLog('info')) {\n const formatted = this.formatMessage('info', message);\n if (data !== undefined) {\n console.info(formatted, this.sanitize(data));\n } else {\n console.info(formatted);\n }\n }\n }\n\n warn(message: string, data?: unknown): void {\n if (this.shouldLog('warn')) {\n const formatted = this.formatMessage('warn', message);\n if (data !== undefined) {\n console.warn(formatted, this.sanitize(data));\n } else {\n console.warn(formatted);\n }\n }\n }\n\n error(message: string, error?: Error | unknown): void {\n if (this.shouldLog('error')) {\n const formatted = this.formatMessage('error', message);\n if (error !== undefined) {\n console.error(formatted, this.sanitize(error));\n } else {\n console.error(formatted);\n }\n }\n }\n}\n","export type Correspondent =\n | 'MTN_MOMO_CMR'\n | 'ORANGE_CMR'\n | 'MTN_MOMO_COG'\n | 'AIRTEL_COG'\n | 'MTN_MOMO_GAB'\n | 'AIRTEL_GAB';\n\nexport const CORRESPONDENTS = [\n 'MTN_MOMO_CMR',\n 'ORANGE_CMR',\n 'MTN_MOMO_COG',\n 'AIRTEL_COG',\n 'MTN_MOMO_GAB',\n 'AIRTEL_GAB',\n] as const;\n\nexport type CorrespondentFeature = 'deposit' | 'payout' | 'refund';\n\nexport interface CorrespondentInfo {\n correspondent: Correspondent;\n name: string;\n country: string;\n countryCode: string;\n currency: string;\n features: CorrespondentFeature[];\n phoneRegex: RegExp;\n}\n\nexport const CORRESPONDENT_INFO: Record<Correspondent, CorrespondentInfo> = {\n MTN_MOMO_CMR: {\n correspondent: 'MTN_MOMO_CMR',\n name: 'MTN Mobile Money',\n country: 'Cameroon',\n countryCode: 'CMR',\n currency: 'XAF',\n features: ['deposit', 'payout', 'refund'],\n phoneRegex: /^237(67|68|65[0-4])\\d{6}$/,\n },\n ORANGE_CMR: {\n correspondent: 'ORANGE_CMR',\n name: 'Orange Money',\n country: 'Cameroon',\n countryCode: 'CMR',\n currency: 'XAF',\n features: ['deposit', 'payout', 'refund'],\n phoneRegex: /^237(69|65[5-9])\\d{6}$/,\n },\n MTN_MOMO_COG: {\n correspondent: 'MTN_MOMO_COG',\n name: 'MTN Mobile Money',\n country: 'Congo',\n countryCode: 'COG',\n currency: 'XAF',\n features: ['deposit', 'payout', 'refund'],\n phoneRegex: /^242(04|05|06)\\d{7}$/,\n },\n AIRTEL_COG: {\n correspondent: 'AIRTEL_COG',\n name: 'Airtel Money',\n country: 'Congo',\n countryCode: 'COG',\n currency: 'XAF',\n features: ['deposit', 'payout'],\n phoneRegex: /^242(01|02|03)\\d{7}$/,\n },\n MTN_MOMO_GAB: {\n correspondent: 'MTN_MOMO_GAB',\n name: 'MTN Mobile Money',\n country: 'Gabon',\n countryCode: 'GAB',\n currency: 'XAF',\n features: ['deposit', 'payout', 'refund'],\n phoneRegex: /^241(06|07)\\d{6}$/,\n },\n AIRTEL_GAB: {\n correspondent: 'AIRTEL_GAB',\n name: 'Airtel Money',\n country: 'Gabon',\n countryCode: 'GAB',\n currency: 'XAF',\n features: ['deposit', 'payout'],\n phoneRegex: /^241(04|05)\\d{6}$/,\n },\n};\n\nexport interface TransactionLimits {\n minDeposit: number;\n maxDeposit: number;\n minPayout: number;\n maxPayout: number;\n currency: string;\n dailyLimit?: number;\n monthlyLimit?: number;\n}\n\nexport const DEFAULT_LIMITS: Record<Correspondent, TransactionLimits> = {\n MTN_MOMO_CMR: {\n minDeposit: 100,\n maxDeposit: 1_000_000,\n minPayout: 500,\n maxPayout: 500_000,\n currency: 'XAF',\n dailyLimit: 2_000_000,\n },\n ORANGE_CMR: {\n minDeposit: 100,\n maxDeposit: 1_000_000,\n minPayout: 500,\n maxPayout: 500_000,\n currency: 'XAF',\n dailyLimit: 2_000_000,\n },\n MTN_MOMO_COG: {\n minDeposit: 100,\n maxDeposit: 500_000,\n minPayout: 500,\n maxPayout: 300_000,\n currency: 'XAF',\n dailyLimit: 1_000_000,\n },\n AIRTEL_COG: {\n minDeposit: 100,\n maxDeposit: 500_000,\n minPayout: 500,\n maxPayout: 300_000,\n currency: 'XAF',\n dailyLimit: 1_000_000,\n },\n MTN_MOMO_GAB: {\n minDeposit: 100,\n maxDeposit: 500_000,\n minPayout: 500,\n maxPayout: 300_000,\n currency: 'XAF',\n dailyLimit: 1_000_000,\n },\n AIRTEL_GAB: {\n minDeposit: 100,\n maxDeposit: 500_000,\n minPayout: 500,\n maxPayout: 300_000,\n currency: 'XAF',\n dailyLimit: 1_000_000,\n },\n};\n","import { z } from 'zod';\nimport { CORRESPONDENTS } from '../constants/correspondents';\nimport type { HttpClient } from '../core/http-client';\nimport type { Logger } from '../core/logger';\nimport { PawapayError } from '../core/errors';\nimport type {\n DepositRequest,\n DepositResponse,\n PayoutRequest,\n PayoutResponse,\n RefundRequest,\n RefundResponse,\n TransactionStatusResponse,\n TransactionStatus,\n PollOptions,\n TransactionFilters,\n PaymentPageRequest,\n PaymentPageResponse,\n ActionResponse,\n} from '../types/transactions';\n\n// V2 API validation schemas\nconst depositRequestSchema = z.object({\n amount: z.number().positive('Amount must be positive').max(10_000_000),\n currency: z.string().min(3).max(3),\n provider: z.enum(CORRESPONDENTS),\n phoneNumber: z.string().regex(/^[0-9]{9,15}$/, 'Phone number must be 9-15 digits'),\n transactionId: z.string().uuid(),\n preAuthorisationCode: z.string().optional(),\n clientReferenceId: z.string().optional(),\n customerMessage: z.string().min(4).max(22).optional(),\n metadata: z.array(z.record(z.unknown())).max(10).optional(),\n});\n\nconst payoutRequestSchema = z.object({\n amount: z.number().positive('Amount must be positive').max(10_000_000),\n currency: z.string().min(3).max(3),\n provider: z.enum(CORRESPONDENTS),\n phoneNumber: z.string().regex(/^[0-9]{9,15}$/, 'Phone number must be 9-15 digits'),\n transactionId: z.string().uuid(),\n clientReferenceId: z.string().optional(),\n customerMessage: z.string().min(4).max(22).optional(),\n metadata: z.array(z.record(z.unknown())).max(10).optional(),\n});\n\nconst paymentPageRequestSchema = z.object({\n depositId: z.string().uuid(),\n returnUrl: z.string().url(),\n phoneNumber: z.string().optional(),\n amountDetails: z.object({\n amount: z.number().positive(),\n currency: z.string().length(3),\n }).optional(),\n language: z.enum(['EN', 'FR']).optional(),\n country: z.string().length(3).optional(),\n reason: z.string().max(50).optional(),\n customerMessage: z.string().min(4).max(22).optional(),\n metadata: z.array(z.record(z.unknown())).max(10).optional(),\n});\n\nconst refundRequestSchema = z.object({\n depositId: z.string().uuid(),\n amount: z.number().positive('Amount must be positive'),\n transactionId: z.string().uuid(),\n});\n\n// V2 Pawapay API request/response interfaces\ninterface PawapayV2DepositRequest {\n depositId: string;\n amount: string;\n currency: string;\n payer: {\n type: 'MMO';\n accountDetails: {\n phoneNumber: string;\n provider: string;\n };\n };\n preAuthorisationCode?: string;\n clientReferenceId?: string;\n customerMessage?: string;\n metadata?: Array<Record<string, unknown>>;\n}\n\ninterface PawapayV2PayoutRequest {\n payoutId: string;\n amount: string;\n currency: string;\n recipient: {\n type: 'MMO';\n accountDetails: {\n phoneNumber: string;\n provider: string;\n };\n };\n clientReferenceId?: string;\n customerMessage?: string;\n metadata?: Array<Record<string, unknown>>;\n}\n\ninterface PawapayV2PaymentPageRequest {\n depositId: string;\n returnUrl: string;\n phoneNumber?: string;\n amountDetails?: {\n amount: string;\n currency: string;\n };\n language?: 'EN' | 'FR';\n country?: string;\n reason?: string;\n customerMessage?: string;\n metadata?: Array<Record<string, unknown>>;\n}\n\ninterface PawapayV2DepositResponse {\n depositId: string;\n status: string;\n created?: string;\n nextStep?: string;\n redirectUrl?: string;\n rejectionReason?: {\n rejectionCode: string;\n rejectionMessage: string;\n };\n}\n\ninterface PawapayV2PayoutResponse {\n payoutId: string;\n status: string;\n created?: string;\n rejectionReason?: {\n rejectionCode: string;\n rejectionMessage: string;\n };\n}\n\ninterface PawapayV2PaymentPageResponse {\n redirectUrl: string;\n}\n\ninterface PawapayRefundRequest {\n refundId: string;\n depositId: string;\n amount?: string;\n}\n\ninterface PawapayRefundResponse {\n refundId: string;\n status: string;\n created?: string;\n rejectionReason?: {\n rejectionCode: string;\n rejectionMessage: string;\n };\n}\n\n// V2 Status check response wrapper\ninterface PawapayV2StatusWrapper {\n status: 'FOUND' | 'NOT_FOUND';\n data?: PawapayV2StatusData;\n}\n\ninterface PawapayV2StatusData {\n depositId?: string;\n payoutId?: string;\n status: string;\n amount: string;\n currency: string;\n country: string;\n created: string;\n customerMessage?: string;\n clientReferenceId?: string;\n providerTransactionId?: string;\n payer?: {\n type: 'MMO';\n accountDetails: {\n phoneNumber: string;\n provider: string;\n };\n };\n recipient?: {\n type: 'MMO';\n accountDetails: {\n phoneNumber: string;\n provider: string;\n };\n };\n failureReason?: {\n failureCode: string;\n failureMessage?: string;\n };\n metadata?: Record<string, string>;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class TransactionsModule {\n constructor(\n private readonly httpClient: HttpClient,\n private readonly logger: Logger\n ) {}\n\n /**\n * Initiate a deposit (collect payment from mobile money user) - V2 API\n */\n async initiateDeposit(request: DepositRequest): Promise<DepositResponse> {\n const validated = depositRequestSchema.parse(request);\n\n const pawapayRequest: PawapayV2DepositRequest = {\n depositId: validated.transactionId,\n amount: validated.amount.toString(),\n currency: validated.currency,\n payer: {\n type: 'MMO',\n accountDetails: {\n phoneNumber: validated.phoneNumber,\n provider: validated.provider,\n },\n },\n preAuthorisationCode: validated.preAuthorisationCode,\n clientReferenceId: validated.clientReferenceId,\n customerMessage: validated.customerMessage,\n metadata: validated.metadata,\n };\n\n this.logger.info(`Initiating V2 deposit ${validated.transactionId}`, {\n amount: validated.amount,\n currency: validated.currency,\n provider: validated.provider,\n });\n\n const response = await this.httpClient.post<PawapayV2DepositResponse>(\n '/v2/deposits',\n pawapayRequest\n );\n\n if (response.status === 'REJECTED' && response.rejectionReason) {\n throw PawapayError.fromPawapayResponse(\n response.rejectionReason.rejectionCode,\n response.rejectionReason.rejectionMessage\n );\n }\n\n this.logger.info(`Deposit ${response.depositId} status: ${response.status}`);\n\n return {\n depositId: response.depositId,\n status: response.status as TransactionStatus,\n created: response.created ?? new Date().toISOString(),\n nextStep: response.nextStep as DepositResponse['nextStep'],\n redirectUrl: response.redirectUrl,\n };\n }\n\n /**\n * Initiate a payout (send money to mobile money user) - V2 API\n */\n async initiatePayout(request: PayoutRequest): Promise<PayoutResponse> {\n const validated = payoutRequestSchema.parse(request);\n\n const pawapayRequest: PawapayV2PayoutRequest = {\n payoutId: validated.transactionId,\n amount: validated.amount.toString(),\n currency: validated.currency,\n recipient: {\n type: 'MMO',\n accountDetails: {\n phoneNumber: validated.phoneNumber,\n provider: validated.provider,\n },\n },\n clientReferenceId: validated.clientReferenceId,\n customerMessage: validated.customerMessage,\n metadata: validated.metadata,\n };\n\n this.logger.info(`Initiating V2 payout ${validated.transactionId}`, {\n amount: validated.amount,\n currency: validated.currency,\n provider: validated.provider,\n });\n\n const response = await this.httpClient.post<PawapayV2PayoutResponse>(\n '/v2/payouts',\n pawapayRequest\n );\n\n if (response.status === 'REJECTED' && response.rejectionReason) {\n throw PawapayError.fromPawapayResponse(\n response.rejectionReason.rejectionCode,\n response.rejectionReason.rejectionMessage\n );\n }\n\n this.logger.info(`Payout ${response.payoutId} status: ${response.status}`);\n\n return {\n payoutId: response.payoutId,\n status: response.status as TransactionStatus,\n created: response.created ?? new Date().toISOString(),\n };\n }\n\n /**\n * Create a hosted payment page - V2 API\n */\n async createPaymentPage(request: PaymentPageRequest): Promise<PaymentPageResponse> {\n const validated = paymentPageRequestSchema.parse(request);\n\n const pawapayRequest: PawapayV2PaymentPageRequest = {\n depositId: validated.depositId,\n returnUrl: validated.returnUrl,\n phoneNumber: validated.phoneNumber,\n amountDetails: validated.amountDetails\n ? {\n amount: validated.amountDetails.amount.toString(),\n currency: validated.amountDetails.currency,\n }\n : undefined,\n language: validated.language,\n country: validated.country,\n reason: validated.reason,\n customerMessage: validated.customerMessage,\n metadata: validated.metadata,\n };\n\n this.logger.info(`Creating payment page for deposit ${validated.depositId}`);\n\n const response = await this.httpClient.post<PawapayV2PaymentPageResponse>(\n '/v2/paymentpage',\n pawapayRequest\n );\n\n this.logger.info(`Payment page created: ${response.redirectUrl}`);\n\n return {\n redirectUrl: response.redirectUrl,\n };\n }\n\n /**\n * Refund a deposit\n */\n async refund(request: RefundRequest): Promise<RefundResponse> {\n const validated = refundRequestSchema.parse(request);\n\n const pawapayRequest: PawapayRefundRequest = {\n refundId: validated.transactionId,\n depositId: validated.depositId,\n amount: validated.amount.toString(),\n };\n\n this.logger.info(`Initiating refund ${validated.transactionId}`, {\n depositId: validated.depositId,\n amount: validated.amount,\n });\n\n const response = await this.httpClient.post<PawapayRefundResponse>(\n '/refunds',\n pawapayRequest\n );\n\n if (response.status === 'REJECTED' && response.rejectionReason) {\n throw PawapayError.fromPawapayResponse(\n response.rejectionReason.rejectionCode,\n response.rejectionReason.rejectionMessage\n );\n }\n\n this.logger.info(`Refund ${response.refundId} status: ${response.status}`);\n\n return {\n refundId: response.refundId,\n depositId: validated.depositId,\n status: response.status as TransactionStatus,\n amount: validated.amount,\n created: response.created ?? new Date().toISOString(),\n };\n }\n\n /**\n * Check deposit status - V2 API\n */\n async checkDepositStatus(depositId: string): Promise<TransactionStatusResponse> {\n if (!z.string().uuid().safeParse(depositId).success) {\n throw PawapayError.validation('Invalid deposit ID format');\n }\n\n const response = await this.httpClient.get<PawapayV2StatusWrapper>(\n `/v2/deposits/${depositId}`\n );\n\n if (response.status === 'NOT_FOUND' || !response.data) {\n throw PawapayError.notFound(`Deposit ${depositId} not found`);\n }\n\n const data = response.data;\n return {\n depositId: data.depositId,\n status: data.status as TransactionStatus,\n amount: data.amount,\n currency: data.currency,\n country: data.country,\n payer: data.payer as TransactionStatusResponse['payer'],\n created: data.created,\n customerMessage: data.customerMessage,\n clientReferenceId: data.clientReferenceId,\n providerTransactionId: data.providerTransactionId,\n failureReason: data.failureReason as TransactionStatusResponse['failureReason'],\n metadata: data.metadata,\n };\n }\n\n /**\n * Check payout status - V2 API\n */\n async checkPayoutStatus(payoutId: string): Promise<TransactionStatusResponse> {\n if (!z.string().uuid().safeParse(payoutId).success) {\n throw PawapayError.validation('Invalid payout ID format');\n }\n\n const response = await this.httpClient.get<PawapayV2StatusWrapper>(\n `/v2/payouts/${payoutId}`\n );\n\n if (response.status === 'NOT_FOUND' || !response.data) {\n throw PawapayError.notFound(`Payout ${payoutId} not found`);\n }\n\n const data = response.data;\n return {\n payoutId: data.payoutId,\n status: data.status as TransactionStatus,\n amount: data.amount,\n currency: data.currency,\n country: data.country,\n recipient: data.recipient as TransactionStatusResponse['recipient'],\n created: data.created,\n customerMessage: data.customerMessage,\n clientReferenceId: data.clientReferenceId,\n providerTransactionId: data.providerTransactionId,\n failureReason: data.failureReason as TransactionStatusResponse['failureReason'],\n metadata: data.metadata,\n };\n }\n\n /**\n * Check transaction status (tries deposit first, then payout) - V2 API\n */\n async checkStatus(transactionId: string): Promise<TransactionStatusResponse> {\n // Try deposit first\n try {\n return await this.checkDepositStatus(transactionId);\n } catch (err) {\n // If not found as deposit, try payout\n if (err instanceof PawapayError && err.code === 'NOT_FOUND') {\n return await this.checkPayoutStatus(transactionId);\n }\n throw err;\n }\n }\n\n /**\n * Poll until transaction reaches final status\n */\n async pollUntilComplete(\n transactionId: string,\n options: PollOptions = {}\n ): Promise<TransactionStatusResponse> {\n const {\n interval = 5000,\n maxAttempts = 12,\n onStatusChange,\n } = options;\n\n let lastStatus: TransactionStatus | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const status = await this.checkStatus(transactionId);\n\n if (status.status !== lastStatus) {\n lastStatus = status.status;\n onStatusChange?.(status.status);\n }\n\n if (status.status === 'COMPLETED' || status.status === 'FAILED') {\n return status;\n }\n\n if (attempt < maxAttempts) {\n await sleep(interval);\n }\n }\n\n const finalStatus = await this.checkStatus(transactionId);\n return finalStatus;\n }\n\n /**\n * List deposits with filters\n */\n async listDeposits(filters?: TransactionFilters): Promise<DepositResponse[]> {\n const params: Record<string, string> = {};\n\n if (filters?.from) params.from = filters.from;\n if (filters?.to) params.to = filters.to;\n if (filters?.status) params.status = filters.status;\n if (filters?.provider) params.provider = filters.provider;\n if (filters?.limit) params.limit = String(filters.limit);\n if (filters?.offset) params.offset = String(filters.offset);\n\n const response = await this.httpClient.get<PawapayV2StatusData[]>('/v2/deposits', {\n params,\n });\n\n return response.map((deposit): DepositResponse => ({\n depositId: deposit.depositId ?? '',\n status: deposit.status as TransactionStatus,\n created: deposit.created,\n }));\n }\n\n /**\n * List payouts with filters\n */\n async listPayouts(filters?: TransactionFilters): Promise<PayoutResponse[]> {\n const params: Record<string, string> = {};\n\n if (filters?.from) params.from = filters.from;\n if (filters?.to) params.to = filters.to;\n if (filters?.status) params.status = filters.status;\n if (filters?.provider) params.provider = filters.provider;\n if (filters?.limit) params.limit = String(filters.limit);\n if (filters?.offset) params.offset = String(filters.offset);\n\n const response = await this.httpClient.get<PawapayV2StatusData[]>('/v2/payouts', {\n params,\n });\n\n return response.map((payout): PayoutResponse => ({\n payoutId: payout.payoutId ?? '',\n status: payout.status as TransactionStatus,\n created: payout.created,\n }));\n }\n\n /**\n * Resend deposit callback - V2 API\n * Triggers a new callback for a deposit transaction\n */\n async resendDepositCallback(depositId: string): Promise<ActionResponse> {\n if (!z.string().uuid().safeParse(depositId).success) {\n throw PawapayError.validation('Invalid deposit ID format');\n }\n\n this.logger.info(`Resending callback for deposit ${depositId}`);\n\n const response = await this.httpClient.post<ActionResponse>(\n `/v2/deposits/${depositId}/resend-callback`,\n {}\n );\n\n this.logger.info(`Resend callback for deposit ${depositId}: ${response.status}`);\n\n return response;\n }\n\n /**\n * Resend payout callback - V2 API\n * Triggers a new callback for a payout transaction\n */\n async resendPayoutCallback(payoutId: string): Promise<ActionResponse> {\n if (!z.string().uuid().safeParse(payoutId).success) {\n throw PawapayError.validation('Invalid payout ID format');\n }\n\n this.logger.info(`Resending callback for payout ${payoutId}`);\n\n const response = await this.httpClient.post<ActionResponse>(\n `/v2/payouts/${payoutId}/resend-callback`,\n {}\n );\n\n this.logger.info(`Resend callback for payout ${payoutId}: ${response.status}`);\n\n return response;\n }\n\n /**\n * Cancel enqueued payout - V2 API\n * Cancels a payout that is still in ENQUEUED status\n */\n async cancelEnqueuedPayout(payoutId: string): Promise<ActionResponse> {\n if (!z.string().uuid().safeParse(payoutId).success) {\n throw PawapayError.validation('Invalid payout ID format');\n }\n\n this.logger.info(`Cancelling enqueued payout ${payoutId}`);\n\n const response = await this.httpClient.post<ActionResponse>(\n `/v2/payouts/${payoutId}/cancel`,\n {}\n );\n\n this.logger.info(`Cancel payout ${payoutId}: ${response.status}`);\n\n return response;\n }\n}\n","import { z } from 'zod';\nimport type { Logger } from '../core/logger';\nimport { PawapayError } from '../core/errors';\nimport type {\n Product,\n ProductCreateRequest,\n DomainAddRequest,\n} from '../types/products';\n\nconst productCreateSchema = z.object({\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n price: z.number().positive(),\n currency: z.enum(['XAF', 'XOF', 'USD']),\n metadata: z.record(z.unknown()).optional(),\n});\n\nconst domainAddSchema = z.object({\n productId: z.string().uuid(),\n domain: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]?\\.[a-zA-Z]{2,}$/),\n});\n\ninterface StoredProduct extends Product {\n metadata?: Record<string, unknown>;\n}\n\nexport class ProductsModule {\n private products: Map<string, StoredProduct> = new Map();\n\n constructor(private readonly logger: Logger) {}\n\n async create(request: ProductCreateRequest): Promise<Product> {\n const validated = productCreateSchema.parse(request);\n\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const product: StoredProduct = {\n id,\n name: validated.name,\n description: validated.description,\n price: validated.price,\n currency: validated.currency,\n domains: [],\n created: now,\n updated: now,\n metadata: validated.metadata,\n };\n\n this.products.set(id, product);\n\n this.logger.info(`Created product ${id}`, { name: validated.name });\n\n return this.toProduct(product);\n }\n\n async get(productId: string): Promise<Product> {\n const product = this.products.get(productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${productId} not found`);\n }\n\n return this.toProduct(product);\n }\n\n async list(): Promise<Product[]> {\n return Array.from(this.products.values()).map((p) => this.toProduct(p));\n }\n\n async update(\n productId: string,\n updates: Partial<ProductCreateRequest>\n ): Promise<Product> {\n const product = this.products.get(productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${productId} not found`);\n }\n\n const validated = productCreateSchema.partial().parse(updates);\n\n const updatedProduct: StoredProduct = {\n ...product,\n ...validated,\n updated: new Date().toISOString(),\n };\n\n this.products.set(productId, updatedProduct);\n\n this.logger.info(`Updated product ${productId}`);\n\n return this.toProduct(updatedProduct);\n }\n\n async delete(productId: string): Promise<void> {\n const product = this.products.get(productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${productId} not found`);\n }\n\n this.products.delete(productId);\n\n this.logger.info(`Deleted product ${productId}`);\n }\n\n async addDomain(request: DomainAddRequest): Promise<Product> {\n const validated = domainAddSchema.parse(request);\n\n const product = this.products.get(validated.productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${validated.productId} not found`);\n }\n\n if (product.domains.includes(validated.domain)) {\n throw PawapayError.validation(`Domain ${validated.domain} already added to product`);\n }\n\n product.domains.push(validated.domain);\n product.updated = new Date().toISOString();\n\n this.logger.info(`Added domain ${validated.domain} to product ${validated.productId}`);\n\n return this.toProduct(product);\n }\n\n async removeDomain(productId: string, domain: string): Promise<Product> {\n const product = this.products.get(productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${productId} not found`);\n }\n\n const domainIndex = product.domains.indexOf(domain);\n\n if (domainIndex === -1) {\n throw PawapayError.notFound(`Domain ${domain} not found in product`);\n }\n\n product.domains.splice(domainIndex, 1);\n product.updated = new Date().toISOString();\n\n this.logger.info(`Removed domain ${domain} from product ${productId}`);\n\n return this.toProduct(product);\n }\n\n private toProduct(stored: StoredProduct): Product {\n return {\n id: stored.id,\n name: stored.name,\n description: stored.description,\n price: stored.price,\n currency: stored.currency,\n domains: [...stored.domains],\n created: stored.created,\n updated: stored.updated,\n };\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto';\nimport type { HttpClient } from '../core/http-client';\nimport type { Logger } from '../core/logger';\nimport { PawapayError } from '../core/errors';\nimport type { PawapayWebhookEvent, WebhookEventType } from '../types/webhooks';\n\nexport interface WebhooksConfig {\n webhookSecret?: string;\n}\n\nexport class WebhooksModule {\n private webhookSecret?: string;\n\n constructor(\n private readonly httpClient: HttpClient,\n private readonly logger: Logger,\n config?: WebhooksConfig\n ) {\n this.webhookSecret = config?.webhookSecret;\n }\n\n setWebhookSecret(secret: string): void {\n this.webhookSecret = secret;\n }\n\n verifySignature(payload: string, signature: string): boolean {\n if (!this.webhookSecret) {\n this.logger.warn('Webhook secret not configured, skipping signature verification');\n return true;\n }\n\n if (!signature) {\n this.logger.warn('No signature provided in webhook request');\n return false;\n }\n\n try {\n const expectedSignature = createHmac('sha256', this.webhookSecret)\n .update(payload, 'utf8')\n .digest('hex');\n\n const signatureBuffer = Buffer.from(signature, 'hex');\n const expectedBuffer = Buffer.from(expectedSignature, 'hex');\n\n if (signatureBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return timingSafeEqual(signatureBuffer, expectedBuffer);\n } catch (error) {\n this.logger.error('Error verifying webhook signature', error);\n return false;\n }\n }\n\n parseEvent<T = unknown>(payload: string): PawapayWebhookEvent<T> {\n try {\n const event = JSON.parse(payload) as PawapayWebhookEvent<T>;\n\n if (!event.eventId || !event.eventType || !event.timestamp) {\n throw new Error('Invalid webhook event structure');\n }\n\n return event;\n } catch (error) {\n throw PawapayError.validation(\n `Failed to parse webhook event: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n constructEvent<T = unknown>(\n payload: string,\n signature: string\n ): PawapayWebhookEvent<T> {\n if (!this.verifySignature(payload, signature)) {\n throw PawapayError.unauthorized('Invalid webhook signature');\n }\n\n return this.parseEvent<T>(payload);\n }\n\n async registerCallback(url: string): Promise<void> {\n this.logger.info(`Registering callback URL: ${url}`);\n\n await this.httpClient.post('/webhooks', { url });\n\n this.logger.info('Callback URL registered successfully');\n }\n\n async unregisterCallback(): Promise<void> {\n this.logger.info('Unregistering callback URL');\n\n await this.httpClient.delete('/webhooks');\n\n this.logger.info('Callback URL unregistered successfully');\n }\n\n isDepositEvent(eventType: WebhookEventType): boolean {\n return eventType.startsWith('deposit.');\n }\n\n isPayoutEvent(eventType: WebhookEventType): boolean {\n return eventType.startsWith('payout.');\n }\n\n isRefundEvent(eventType: WebhookEventType): boolean {\n return eventType.startsWith('refund.');\n }\n\n isSuccessEvent(eventType: WebhookEventType): boolean {\n return eventType.endsWith('.completed');\n }\n\n isFailureEvent(eventType: WebhookEventType): boolean {\n return eventType.endsWith('.failed');\n }\n}\n","import { v4 as uuidv4, validate as uuidValidate, version as uuidVersion } from 'uuid';\nimport {\n CORRESPONDENTS,\n CORRESPONDENT_INFO,\n DEFAULT_LIMITS,\n type Correspondent,\n type CorrespondentInfo,\n type TransactionLimits,\n} from '../constants/correspondents';\nimport type { HttpClient } from '../core/http-client';\nimport type { Logger } from '../core/logger';\nimport type {\n CountryAvailability,\n PredictProviderResponse,\n ActiveConfigResponse,\n PublicKeyResponse,\n OperationType,\n} from '../types/toolkit';\n\nexport interface MMOAvailability {\n correspondent: Correspondent;\n available: boolean;\n degraded: boolean;\n estimatedRecovery?: string;\n message?: string;\n}\n\nexport class UtilsModule {\n constructor(\n private readonly httpClient: HttpClient,\n private readonly logger: Logger\n ) {}\n\n generateTransactionId(): string {\n return uuidv4();\n }\n\n validateTransactionId(id: string): boolean {\n return uuidValidate(id) && uuidVersion(id) === 4;\n }\n\n /**\n * Get active configuration - V2 API\n * Returns your account configuration including countries, providers, and limits\n */\n async getActiveConfiguration(options?: {\n country?: string;\n operationType?: OperationType;\n }): Promise<ActiveConfigResponse> {\n const params: Record<string, string> = {};\n if (options?.country) params.country = options.country;\n if (options?.operationType) params.operationType = options.operationType;\n\n this.logger.info('Fetching active configuration', options);\n\n const response = await this.httpClient.get<ActiveConfigResponse>('/v2/active-conf', {\n params: Object.keys(params).length > 0 ? params : undefined,\n });\n\n this.logger.info(`Retrieved configuration for ${response.countries.length} countries`);\n\n return response;\n }\n\n /**\n * Get provider availability - V2 API\n * Returns current processing status for all providers\n */\n async getProviderAvailability(options?: {\n country?: string;\n operationType?: OperationType;\n }): Promise<CountryAvailability[]> {\n const params: Record<string, string> = {};\n if (options?.country) params.country = options.country;\n if (options?.operationType) params.operationType = options.operationType;\n\n this.logger.info('Fetching provider availability', options);\n\n const response = await this.httpClient.get<CountryAvailability[]>('/v2/availability', {\n params: Object.keys(params).length > 0 ? params : undefined,\n });\n\n return response;\n }\n\n /**\n * Predict provider from phone number - V2 API\n * Returns the predicted provider and sanitized phone number\n */\n async predictProvider(phoneNumber: string): Promise<PredictProviderResponse> {\n this.logger.info('Predicting provider for phone number');\n\n const response = await this.httpClient.post<PredictProviderResponse>(\n '/v2/predict-provider',\n { phoneNumber }\n );\n\n this.logger.info(`Predicted provider: ${response.provider} (${response.country})`);\n\n return response;\n }\n\n /**\n * Get public keys for callback verification - V2 API\n */\n async getPublicKeys(): Promise<PublicKeyResponse[]> {\n this.logger.info('Fetching public keys');\n\n const response = await this.httpClient.get<PublicKeyResponse[]>('/v2/public-key/http');\n\n this.logger.info(`Retrieved ${response.length} public keys`);\n\n return response;\n }\n\n async getTransactionLimits(correspondent: Correspondent): Promise<TransactionLimits> {\n try {\n const config = await this.getActiveConfiguration();\n\n for (const country of config.countries) {\n for (const provider of country.providers) {\n if (provider.provider === correspondent) {\n const currency = provider.currencies[0];\n if (currency?.operationTypes) {\n const deposit = currency.operationTypes.DEPOSIT;\n const payout = currency.operationTypes.PAYOUT;\n const defaults = DEFAULT_LIMITS[correspondent];\n\n return {\n minDeposit: deposit?.minAmount ? parseFloat(deposit.minAmount) : defaults.minDeposit,\n maxDeposit: deposit?.maxAmount ? parseFloat(deposit.maxAmount) : defaults.maxDeposit,\n minPayout: payout?.minAmount ? parseFloat(payout.minAmount) : defaults.minPayout,\n maxPayout: payout?.maxAmount ? parseFloat(payout.maxAmount) : defaults.maxPayout,\n currency: currency.currency,\n dailyLimit: defaults.dailyLimit,\n };\n }\n }\n }\n }\n } catch (error) {\n this.logger.warn(`Failed to fetch live limits for ${correspondent}, using defaults`, error);\n }\n\n return DEFAULT_LIMITS[correspondent];\n }\n\n async checkMMOAvailability(correspondent: Correspondent): Promise<MMOAvailability> {\n try {\n const availability = await this.getProviderAvailability();\n\n for (const country of availability) {\n const provider = country.providers.find((p) => p.provider === correspondent);\n if (provider) {\n const depositStatus = provider.operationTypes.find((op) => op.operationType === 'DEPOSIT');\n const payoutStatus = provider.operationTypes.find((op) => op.operationType === 'PAYOUT');\n\n const isOperational =\n depositStatus?.status === 'OPERATIONAL' ||\n payoutStatus?.status === 'OPERATIONAL';\n const isDelayed =\n depositStatus?.status === 'DELAYED' ||\n payoutStatus?.status === 'DELAYED';\n const isClosed =\n depositStatus?.status === 'CLOSED' &&\n payoutStatus?.status === 'CLOSED';\n\n return {\n correspondent,\n available: isOperational || isDelayed,\n degraded: isDelayed,\n message: isClosed ? 'Provider is currently closed' : undefined,\n };\n }\n }\n\n return {\n correspondent,\n available: false,\n degraded: false,\n message: 'Correspondent not found in availability list',\n };\n } catch (error) {\n this.logger.warn(`Failed to check MMO availability for ${correspondent}`, error);\n\n return {\n correspondent,\n available: false,\n degraded: true,\n message: 'Unable to verify availability',\n };\n }\n }\n\n formatPhoneNumber(phone: string, countryCode: string): string {\n let cleaned = phone.replace(/\\D/g, '');\n\n if (cleaned.startsWith('00')) {\n cleaned = cleaned.slice(2);\n }\n\n const countryPrefixes: Record<string, string> = {\n CMR: '237',\n COG: '242',\n GAB: '241',\n ZMB: '260',\n GHA: '233',\n KEN: '254',\n TZA: '255',\n UGA: '256',\n RWA: '250',\n BEN: '229',\n CIV: '225',\n SEN: '221',\n };\n\n const prefix = countryPrefixes[countryCode.toUpperCase()];\n\n if (prefix && !cleaned.startsWith(prefix)) {\n if (cleaned.startsWith('0')) {\n cleaned = cleaned.slice(1);\n }\n cleaned = prefix + cleaned;\n }\n\n return cleaned;\n }\n\n validatePhoneNumber(phone: string, correspondent: Correspondent): boolean {\n const info = CORRESPONDENT_INFO[correspondent];\n if (!info) {\n return false;\n }\n\n const cleaned = phone.replace(/\\D/g, '');\n return info.phoneRegex.test(cleaned);\n }\n\n getSupportedCorrespondents(): readonly Correspondent[] {\n return CORRESPONDENTS;\n }\n\n getCorrespondentInfo(correspondent: Correspondent): CorrespondentInfo {\n return CORRESPONDENT_INFO[correspondent];\n }\n\n getAllCorrespondentsInfo(): CorrespondentInfo[] {\n return Object.values(CORRESPONDENT_INFO);\n }\n\n detectCorrespondent(phone: string): Correspondent | null {\n const cleaned = phone.replace(/\\D/g, '');\n\n for (const [correspondent, info] of Object.entries(CORRESPONDENT_INFO)) {\n if (info.phoneRegex.test(cleaned)) {\n return correspondent as Correspondent;\n }\n }\n\n return null;\n }\n}\n","import { z } from 'zod';\nimport type { HttpClient } from '../core/http-client';\nimport type { Logger } from '../core/logger';\nimport { PawapayError } from '../core/errors';\nimport type {\n WalletBalance,\n WalletBalancesResponse,\n StatementRequest,\n StatementResponse,\n StatementStatusResponse,\n StatementData,\n} from '../types/finances';\n\nconst statementRequestSchema = z.object({\n wallet: z.object({\n country: z.string().length(3),\n currency: z.string().length(3),\n provider: z.string().optional(),\n }),\n callbackUrl: z.string().url(),\n startDate: z.string(),\n endDate: z.string(),\n compressed: z.boolean().optional(),\n});\n\nexport class FinancesModule {\n constructor(\n private readonly httpClient: HttpClient,\n private readonly logger: Logger\n ) {}\n\n /**\n * Get wallet balances - V2 API\n * Returns balances for all wallets configured on your account\n */\n async getWalletBalances(): Promise<WalletBalance[]> {\n this.logger.info('Fetching wallet balances');\n\n const response = await this.httpClient.get<WalletBalancesResponse>(\n '/v2/wallets/balances'\n );\n\n this.logger.info(`Retrieved ${response.balances.length} wallet balances`);\n\n return response.balances;\n }\n\n /**\n * Generate a statement for a wallet - V2 API\n * The statement can be downloaded from the callback URL or checked via status endpoint\n */\n async generateStatement(request: StatementRequest): Promise<StatementResponse> {\n const validated = statementRequestSchema.parse(request);\n\n this.logger.info('Generating statement', {\n wallet: validated.wallet,\n startDate: validated.startDate,\n endDate: validated.endDate,\n });\n\n const response = await this.httpClient.post<StatementResponse>(\n '/v2/statements',\n validated\n );\n\n if (response.status === 'REJECTED' && response.failureReason) {\n throw PawapayError.fromPawapayResponse(\n response.failureReason.failureCode,\n response.failureReason.failureMessage\n );\n }\n\n this.logger.info(`Statement ${response.statementId} status: ${response.status}`);\n\n return response;\n }\n\n /**\n * Check statement status - V2 API\n */\n async checkStatementStatus(statementId: string): Promise<StatementData> {\n if (!z.string().uuid().safeParse(statementId).success) {\n throw PawapayError.validation('Invalid statement ID format');\n }\n\n const response = await this.httpClient.get<StatementStatusResponse>(\n `/v2/statements/${statementId}`\n );\n\n if (response.status === 'NOT_FOUND' || !response.data) {\n throw PawapayError.notFound(`Statement ${statementId} not found`);\n }\n\n this.logger.info(`Statement ${statementId} status: ${response.data.status}`);\n\n return response.data;\n }\n\n /**\n * Poll until statement is ready\n */\n async pollStatementUntilComplete(\n statementId: string,\n options: { interval?: number; maxAttempts?: number } = {}\n ): Promise<StatementData> {\n const { interval = 5000, maxAttempts = 24 } = options;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const status = await this.checkStatementStatus(statementId);\n\n if (status.status === 'COMPLETED' || status.status === 'FAILED') {\n return status;\n }\n\n if (attempt < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n }\n\n return this.checkStatementStatus(statementId);\n }\n}\n","import type { SpaarkPayApiSdkConfig, ResolvedConfig, LogLevel } from './types/config';\nimport { resolveConfig, getConfigFromEnv } from './config';\nimport { HttpClient } from './core/http-client';\nimport { Logger } from './core/logger';\nimport { TransactionsModule } from './modules/transactions';\nimport { ProductsModule } from './modules/products';\nimport { WebhooksModule } from './modules/webhooks';\nimport { UtilsModule } from './modules/utils';\nimport { FinancesModule } from './modules/finances';\n\nexport class SpaarkPayApiSdk {\n private readonly config: ResolvedConfig;\n private readonly logger: Logger;\n private readonly httpClient: HttpClient;\n\n readonly transactions: TransactionsModule;\n readonly products: ProductsModule;\n readonly webhooks: WebhooksModule;\n readonly utils: UtilsModule;\n readonly finances: FinancesModule;\n\n constructor(config: SpaarkPayApiSdkConfig) {\n const envConfig = getConfigFromEnv();\n const mergedConfig: SpaarkPayApiSdkConfig = {\n ...envConfig,\n ...config,\n };\n\n this.config = resolveConfig(mergedConfig);\n this.logger = new Logger('SpaarkPayApiSdk', this.config.logLevel);\n this.httpClient = HttpClient.fromConfig(this.config, this.logger);\n\n this.transactions = new TransactionsModule(this.httpClient, this.logger);\n this.products = new ProductsModule(this.logger);\n this.webhooks = new WebhooksModule(this.httpClient, this.logger, {\n webhookSecret: this.getWebhookSecretFromEnv(),\n });\n this.utils = new UtilsModule(this.httpClient, this.logger);\n this.finances = new FinancesModule(this.httpClient, this.logger);\n\n this.logger.info(`SpaarkPayApiSdk initialized`, {\n environment: this.config.environment,\n baseUrl: this.config.baseUrl,\n });\n }\n\n private getWebhookSecretFromEnv(): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env['PAWAPAY_WEBHOOK_SECRET'];\n }\n return undefined;\n }\n\n getConfig(): Readonly<ResolvedConfig> {\n return { ...this.config };\n }\n\n setLogLevel(level: LogLevel): void {\n this.logger.setLevel(level);\n }\n\n setWebhookSecret(secret: string): void {\n this.webhooks.setWebhookSecret(secret);\n }\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport type { Correspondent } from './constants/correspondents';\nimport type { DepositResponse, PayoutResponse } from './types/transactions';\n\ntype OperationStatus = 'idle' | 'loading' | 'success' | 'error';\ntype TabType = 'deposit' | 'payout' | 'status' | 'toolkit' | 'finances';\n\ninterface TestResult {\n id: string;\n operation: string;\n status: OperationStatus;\n response?: unknown;\n error?: string;\n timestamp: string;\n}\n\nexport interface PawapayTestDashboardProps {\n apiKey?: string;\n environment?: 'sandbox' | 'production';\n className?: string;\n demoMode?: boolean;\n /** Base path for API routes (e.g., '/api/pawapay'). When set, requests go through your server instead of directly to Pawapay. */\n apiBasePath?: string;\n onDepositComplete?: (response: DepositResponse) => void;\n onPayoutComplete?: (response: PayoutResponse) => void;\n onError?: (error: Error) => void;\n}\n\n// Mock response generators for demo mode (V2 API format)\nconst createMockDepositResponse = (txId: string): DepositResponse => ({\n depositId: txId,\n status: 'ACCEPTED',\n created: new Date().toISOString(),\n nextStep: 'FINAL_STATUS',\n});\n\nconst createMockPayoutResponse = (txId: string): PayoutResponse => ({\n payoutId: txId,\n status: 'ACCEPTED',\n created: new Date().toISOString(),\n});\n\nconst createMockStatusResponse = (txId: string) => ({\n depositId: txId,\n status: ['COMPLETED', 'ACCEPTED', 'PROCESSING', 'ENQUEUED'][Math.floor(Math.random() * 4)],\n created: new Date(Date.now() - 60000).toISOString(),\n amount: '5000',\n currency: 'XAF',\n country: 'CMR',\n payer: {\n type: 'MMO',\n accountDetails: {\n phoneNumber: '237670000000',\n provider: 'MTN_MOMO_CMR',\n },\n },\n});\n\nconst createMockAvailabilityResponse = () => [\n {\n country: 'CMR',\n providers: [\n {\n provider: 'MTN_MOMO_CMR',\n operationTypes: [\n { operationType: 'DEPOSIT', status: 'OPERATIONAL' },\n { operationType: 'PAYOUT', status: 'OPERATIONAL' },\n ],\n },\n {\n provider: 'ORANGE_CMR',\n operationTypes: [\n { operationType: 'DEPOSIT', status: 'OPERATIONAL' },\n { operationType: 'PAYOUT', status: 'DELAYED' },\n ],\n },\n ],\n },\n];\n\nconst createMockPredictResponse = (phone: string) => ({\n country: 'CMR',\n provider: phone.startsWith('23767') ? 'MTN_MOMO_CMR' : 'ORANGE_CMR',\n phoneNumber: phone.replace(/\\D/g, ''),\n});\n\nconst createMockActiveConfigResponse = () => ({\n companyName: 'Demo Company',\n signatureConfiguration: {\n signedRequestsOnly: false,\n signedCallbacks: true,\n },\n countries: [\n {\n country: 'CMR',\n displayName: { en: 'Cameroon', fr: 'Cameroun' },\n prefix: '237',\n flag: 'https://cdn.pawapay.io/flags/cmr.svg',\n providers: [\n {\n provider: 'MTN_MOMO_CMR',\n displayName: 'MTN Mobile Money',\n nameDisplayedToCustomer: 'MTN MoMo',\n currencies: [\n {\n currency: 'XAF',\n displayName: 'CFA Franc',\n operationTypes: {\n DEPOSIT: { minAmount: '100', maxAmount: '1000000', status: 'OPERATIONAL' },\n PAYOUT: { minAmount: '100', maxAmount: '500000', status: 'OPERATIONAL' },\n },\n },\n ],\n },\n ],\n },\n ],\n});\n\nconst createMockWalletBalancesResponse = () => ({\n balances: [\n { country: 'CMR', currency: 'XAF', balance: '1250000.00' },\n { country: 'COG', currency: 'XAF', balance: '450000.00' },\n { country: 'GAB', currency: 'XAF', balance: '780000.00' },\n ],\n});\n\nconst createMockPublicKeysResponse = () => [\n {\n id: 'key-001',\n key: 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...',\n },\n];\n\nconst simulateDelay = (ms: number = 800) => new Promise(resolve => setTimeout(resolve, ms + Math.random() * 400));\n\nconst generateUUID = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\nconst PROVIDER_OPTIONS: Array<{ value: Correspondent; label: string; country: string }> = [\n { value: 'MTN_MOMO_CMR', label: 'MTN Mobile Money', country: 'Cameroun' },\n { value: 'ORANGE_CMR', label: 'Orange Money', country: 'Cameroun' },\n { value: 'MTN_MOMO_COG', label: 'MTN Mobile Money', country: 'Congo' },\n { value: 'AIRTEL_COG', label: 'Airtel Money', country: 'Congo' },\n { value: 'MTN_MOMO_GAB', label: 'MTN Mobile Money', country: 'Gabon' },\n { value: 'AIRTEL_GAB', label: 'Airtel Money', country: 'Gabon' },\n];\n\nconst CURRENCY_OPTIONS = [\n { value: 'XAF', label: 'XAF (CFA Franc BEAC)' },\n { value: 'XOF', label: 'XOF (CFA Franc BCEAO)' },\n { value: 'GHS', label: 'GHS (Ghana Cedi)' },\n { value: 'KES', label: 'KES (Kenyan Shilling)' },\n { value: 'RWF', label: 'RWF (Rwandan Franc)' },\n { value: 'TZS', label: 'TZS (Tanzanian Shilling)' },\n { value: 'UGX', label: 'UGX (Ugandan Shilling)' },\n { value: 'ZMW', label: 'ZMW (Zambian Kwacha)' },\n];\n\nexport function PawapayTestDashboard({\n apiKey: initialApiKey = '',\n environment: initialEnvironment = 'sandbox',\n className = '',\n demoMode: initialDemoMode = false,\n apiBasePath = '/api/pawapay',\n onDepositComplete,\n onPayoutComplete,\n onError,\n}: PawapayTestDashboardProps) {\n const [apiKey, setApiKey] = useState(initialApiKey);\n const [environment, setEnvironment] = useState<'sandbox' | 'production'>(initialEnvironment);\n const [isConfigured, setIsConfigured] = useState(!!initialApiKey || initialDemoMode);\n const [isDemoMode, setIsDemoMode] = useState(initialDemoMode);\n\n const [activeTab, setActiveTab] = useState<TabType>('deposit');\n const [phoneNumber, setPhoneNumber] = useState('237670000000');\n const [amount, setAmount] = useState('5000');\n const [currency, setCurrency] = useState('XAF');\n const [provider, setProvider] = useState<Correspondent>('MTN_MOMO_CMR');\n const [description, setDescription] = useState('Test Payment');\n const [transactionId, setTransactionId] = useState('');\n\n const [results, setResults] = useState<TestResult[]>([]);\n const [currentStatus, setCurrentStatus] = useState<OperationStatus>('idle');\n\n const addResult = useCallback((operation: string, status: OperationStatus, response?: unknown, error?: string) => {\n const result: TestResult = {\n id: generateUUID(),\n operation,\n status,\n response,\n error,\n timestamp: new Date().toLocaleTimeString(),\n };\n setResults((prev) => [result, ...prev].slice(0, 20));\n }, []);\n\n const handleConfigure = useCallback(() => {\n if (!apiKey.trim()) {\n addResult('Configuration', 'error', undefined, 'API Key is required');\n return;\n }\n setIsConfigured(true);\n setIsDemoMode(false);\n addResult('Configuration', 'success', { environment, configured: true, apiBasePath });\n }, [apiKey, environment, apiBasePath, addResult]);\n\n const handleDemoMode = useCallback(() => {\n setIsDemoMode(true);\n setIsConfigured(true);\n addResult('Configuration', 'success', { mode: 'demo', message: 'Demo mode activated - responses are simulated' });\n }, [addResult]);\n\n const handleDeposit = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n const txId = generateUUID();\n setTransactionId(txId);\n\n let response: DepositResponse;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockDepositResponse(txId);\n } else {\n const res = await fetch(`${apiBasePath}/deposit`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n apiKey,\n environment,\n amount: parseFloat(amount),\n currency,\n provider,\n phoneNumber,\n customerMessage: description.slice(0, 22),\n transactionId: txId,\n }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Deposit failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Deposit', 'success', response);\n onDepositComplete?.(response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Deposit failed';\n addResult('Deposit', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, amount, currency, provider, phoneNumber, description, addResult, onDepositComplete, onError]);\n\n const handlePayout = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n const txId = generateUUID();\n setTransactionId(txId);\n\n let response: PayoutResponse;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockPayoutResponse(txId);\n } else {\n const res = await fetch(`${apiBasePath}/payout`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n apiKey,\n environment,\n amount: parseFloat(amount),\n currency,\n provider,\n phoneNumber,\n transactionId: txId,\n }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Payout failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Payout', 'success', response);\n onPayoutComplete?.(response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Payout failed';\n addResult('Payout', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, amount, currency, provider, phoneNumber, addResult, onPayoutComplete, onError]);\n\n const handleCheckStatus = useCallback(async () => {\n if ((!apiKey && !isDemoMode) || !transactionId) {\n addResult('Check Status', 'error', undefined, 'No transaction ID');\n return;\n }\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockStatusResponse(transactionId);\n } else {\n const res = await fetch(`${apiBasePath}/status`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment, transactionId }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Status check failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Check Status', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Status check failed';\n addResult('Check Status', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, transactionId, addResult, onError]);\n\n const handleGetAvailability = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockAvailabilityResponse();\n } else {\n const res = await fetch(`${apiBasePath}/availability`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Availability check failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Provider Availability', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Availability check failed';\n addResult('Provider Availability', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, addResult, onError]);\n\n const handlePredictProvider = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockPredictResponse(phoneNumber);\n } else {\n const res = await fetch(`${apiBasePath}/predict-provider`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment, phoneNumber }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Prediction failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Predict Provider', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Prediction failed';\n addResult('Predict Provider', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, phoneNumber, addResult, onError]);\n\n const handleGetActiveConfig = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockActiveConfigResponse();\n } else {\n const res = await fetch(`${apiBasePath}/active-config`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Failed to get config');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Active Configuration', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Failed to get config';\n addResult('Active Configuration', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, addResult, onError]);\n\n const handleGetPublicKeys = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockPublicKeysResponse();\n } else {\n const res = await fetch(`${apiBasePath}/public-keys`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Failed to get public keys');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Public Keys', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Failed to get public keys';\n addResult('Public Keys', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, addResult, onError]);\n\n const handleGetWalletBalances = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockWalletBalancesResponse();\n } else {\n const res = await fetch(`${apiBasePath}/wallet-balances`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Failed to get balances');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Wallet Balances', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Failed to get balances';\n addResult('Wallet Balances', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, addResult, onError]);\n\n const copyToClipboard = useCallback((text: string) => {\n navigator.clipboard.writeText(text);\n }, []);\n\n if (!isConfigured) {\n return (\n <div className={`space-y-8 ${className}`}>\n <div>\n <h1 className=\"text-2xl font-bold tracking-tight\">SDK Test Console</h1>\n <p className=\"text-muted-foreground mt-1\">\n Configure your Pawapay SDK credentials to start testing\n </p>\n </div>\n\n <div className=\"border border-border bg-background p-6 max-w-md space-y-6\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 bg-muted flex items-center justify-center\">\n <SettingsIcon />\n </div>\n <div>\n <h2 className=\"font-semibold\">SDK Configuration</h2>\n <p className=\"text-xs text-muted-foreground\">Enter your API credentials</p>\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">API Key</label>\n <input\n type=\"password\"\n placeholder=\"pk_sandbox_...\"\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Environment</label>\n <div className=\"flex gap-2\">\n <button\n onClick={() => setEnvironment('sandbox')}\n className={`h-8 px-3 text-xs font-medium border transition-colors ${\n environment === 'sandbox'\n ? 'bg-primary text-primary-foreground border-primary'\n : 'bg-background border-border hover:bg-muted'\n }`}\n >\n Sandbox\n </button>\n <button\n onClick={() => setEnvironment('production')}\n className={`h-8 px-3 text-xs font-medium border transition-colors ${\n environment === 'production'\n ? 'bg-primary text-primary-foreground border-primary'\n : 'bg-background border-border hover:bg-muted'\n }`}\n >\n Production\n </button>\n </div>\n </div>\n\n <button\n onClick={handleConfigure}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 transition-colors flex items-center justify-center gap-2\"\n >\n <PlayIcon />\n Initialize SDK\n </button>\n\n <div className=\"relative flex items-center py-2\">\n <div className=\"flex-grow border-t border-border\"></div>\n <span className=\"flex-shrink mx-3 text-xs text-muted-foreground\">ou</span>\n <div className=\"flex-grow border-t border-border\"></div>\n </div>\n\n <button\n onClick={handleDemoMode}\n className=\"w-full h-8 px-3 text-xs font-medium border border-border bg-background hover:bg-muted transition-colors flex items-center justify-center gap-2\"\n >\n <BeakerIcon />\n Mode Démo (sans API key)\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`space-y-6 ${className}`}>\n <div className=\"flex items-center justify-between flex-wrap gap-4\">\n <div>\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-2xl font-bold tracking-tight\">SDK Test Console</h1>\n {isDemoMode && (\n <span className=\"px-2 py-0.5 text-xs font-medium bg-amber-100 text-amber-800 dark:bg-amber-900 dark:text-amber-200\">\n DEMO\n </span>\n )}\n </div>\n <p className=\"text-muted-foreground mt-1\">\n {isDemoMode\n ? 'Mode démo - Les réponses sont simulées'\n : `Test Pawapay SDK operations in ${environment} mode`\n }\n </p>\n </div>\n <button\n onClick={() => setIsConfigured(false)}\n className=\"h-8 px-3 text-xs font-medium border border-border bg-background hover:bg-muted transition-colors flex items-center gap-2\"\n >\n <SettingsIcon />\n Reconfigure\n </button>\n </div>\n\n <div className=\"grid lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Tabs */}\n <div className=\"flex flex-wrap gap-1 bg-muted p-1\">\n <button\n onClick={() => setActiveTab('deposit')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'deposit' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <WalletIcon />\n Deposit\n </button>\n <button\n onClick={() => setActiveTab('payout')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'payout' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <PhoneIcon />\n Payout\n </button>\n <button\n onClick={() => setActiveTab('status')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'status' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <RefreshIcon />\n Status\n </button>\n <button\n onClick={() => setActiveTab('toolkit')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'toolkit' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <ToolkitIcon />\n Toolkit\n </button>\n <button\n onClick={() => setActiveTab('finances')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'finances' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <ChartIcon />\n Finances\n </button>\n </div>\n\n {/* Deposit Tab */}\n {activeTab === 'deposit' && (\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Initiate Deposit</h3>\n <p className=\"text-xs text-muted-foreground\">Collect payment from a Mobile Money user</p>\n </div>\n\n <div className=\"grid sm:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Phone Number</label>\n <input\n placeholder=\"237670000000\"\n value={phoneNumber}\n onChange={(e) => setPhoneNumber(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Amount</label>\n <input\n type=\"number\"\n placeholder=\"5000\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Currency</label>\n <select\n value={currency}\n onChange={(e) => setCurrency(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {CURRENCY_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>{c.label}</option>\n ))}\n </select>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Provider</label>\n <select\n value={provider}\n onChange={(e) => setProvider(e.target.value as Correspondent)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {PROVIDER_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>{c.label} ({c.country})</option>\n ))}\n </select>\n </div>\n <div className=\"space-y-2 sm:col-span-2\">\n <label className=\"text-xs font-medium\">Customer Message (4-22 chars)</label>\n <input\n placeholder=\"Payment description\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n maxLength={22}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n </div>\n\n <button\n onClick={handleDeposit}\n disabled={currentStatus === 'loading'}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <PlayIcon />}\n Execute Deposit\n </button>\n </div>\n )}\n\n {/* Payout Tab */}\n {activeTab === 'payout' && (\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Initiate Payout</h3>\n <p className=\"text-xs text-muted-foreground\">Send money to a Mobile Money account</p>\n </div>\n\n <div className=\"grid sm:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Recipient Phone</label>\n <input\n placeholder=\"237670000000\"\n value={phoneNumber}\n onChange={(e) => setPhoneNumber(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Amount</label>\n <input\n type=\"number\"\n placeholder=\"5000\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Currency</label>\n <select\n value={currency}\n onChange={(e) => setCurrency(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {CURRENCY_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>{c.label}</option>\n ))}\n </select>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Provider</label>\n <select\n value={provider}\n onChange={(e) => setProvider(e.target.value as Correspondent)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {PROVIDER_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>{c.label} ({c.country})</option>\n ))}\n </select>\n </div>\n </div>\n\n <button\n onClick={handlePayout}\n disabled={currentStatus === 'loading'}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <PlayIcon />}\n Execute Payout\n </button>\n </div>\n )}\n\n {/* Status Tab */}\n {activeTab === 'status' && (\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Check Transaction Status</h3>\n <p className=\"text-xs text-muted-foreground\">Query the status of a transaction</p>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Transaction ID</label>\n <div className=\"flex gap-2\">\n <input\n placeholder=\"Enter transaction ID (UUID)\"\n value={transactionId}\n onChange={(e) => setTransactionId(e.target.value)}\n className=\"flex-1 h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring font-mono\"\n />\n {transactionId && (\n <button\n onClick={() => copyToClipboard(transactionId)}\n className=\"w-8 h-8 border border-border bg-background hover:bg-muted transition-colors flex items-center justify-center\"\n title=\"Copy to clipboard\"\n >\n <CopyIcon />\n </button>\n )}\n </div>\n </div>\n\n <button\n onClick={handleCheckStatus}\n disabled={currentStatus === 'loading' || !transactionId}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <RefreshIcon />}\n Check Status\n </button>\n </div>\n </div>\n )}\n\n {/* Toolkit Tab */}\n {activeTab === 'toolkit' && (\n <div className=\"space-y-4\">\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Predict Provider</h3>\n <p className=\"text-xs text-muted-foreground\">Predict the provider from a phone number</p>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Phone Number</label>\n <input\n placeholder=\"+237 670 000 000\"\n value={phoneNumber}\n onChange={(e) => setPhoneNumber(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n\n <button\n onClick={handlePredictProvider}\n disabled={currentStatus === 'loading'}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <SearchIcon />}\n Predict Provider\n </button>\n </div>\n\n <div className=\"grid sm:grid-cols-3 gap-3\">\n <button\n onClick={handleGetAvailability}\n disabled={currentStatus === 'loading'}\n className=\"h-10 px-3 text-xs font-medium border border-border bg-background hover:bg-muted disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n <SignalIcon />\n Provider Availability\n </button>\n <button\n onClick={handleGetActiveConfig}\n disabled={currentStatus === 'loading'}\n className=\"h-10 px-3 text-xs font-medium border border-border bg-background hover:bg-muted disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n <SettingsIcon />\n Active Config\n </button>\n <button\n onClick={handleGetPublicKeys}\n disabled={currentStatus === 'loading'}\n className=\"h-10 px-3 text-xs font-medium border border-border bg-background hover:bg-muted disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n <KeyIcon />\n Public Keys\n </button>\n </div>\n </div>\n )}\n\n {/* Finances Tab */}\n {activeTab === 'finances' && (\n <div className=\"space-y-4\">\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Wallet Balances</h3>\n <p className=\"text-xs text-muted-foreground\">View balances for all your wallets</p>\n </div>\n\n <button\n onClick={handleGetWalletBalances}\n disabled={currentStatus === 'loading'}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <WalletIcon />}\n Get Wallet Balances\n </button>\n </div>\n\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Statements</h3>\n <p className=\"text-xs text-muted-foreground\">Generate financial statements for your wallets</p>\n </div>\n\n <div className=\"p-4 bg-muted/50 text-xs text-muted-foreground\">\n Statement generation requires callback URL configuration. Use the SDK directly:\n <pre className=\"mt-2 p-2 bg-background overflow-x-auto\">\n{`await sdk.finances.generateStatement({\n wallet: { country: 'CMR', currency: 'XAF' },\n callbackUrl: 'https://your-site.com/callback',\n startDate: '2025-01-01T00:00:00Z',\n endDate: '2025-01-31T23:59:59Z',\n});`}\n </pre>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Results Panel */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-semibold\">Results</h3>\n {results.length > 0 && (\n <button\n onClick={() => setResults([])}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Clear\n </button>\n )}\n </div>\n\n <div className=\"border border-border bg-background divide-y divide-border max-h-[600px] overflow-y-auto\">\n {results.length === 0 ? (\n <div className=\"p-6 text-center text-muted-foreground text-xs\">\n No results yet. Execute an operation to see results here.\n </div>\n ) : (\n results.map((result) => (\n <div key={result.id} className=\"p-4 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {result.status === 'success' ? (\n <CheckIcon className=\"text-green-600\" />\n ) : (\n <XIcon className=\"text-red-600\" />\n )}\n <span className=\"font-medium text-sm\">{result.operation}</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">{result.timestamp}</span>\n </div>\n\n {result.error ? (\n <p className=\"text-xs text-red-600\">{result.error}</p>\n ) : (\n <pre className=\"text-xs bg-muted p-2 overflow-x-auto max-h-48\">\n {JSON.stringify(result.response, null, 2)}\n </pre>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// Simple SVG Icons (no external dependencies)\nconst SettingsIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst WalletIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z\" />\n </svg>\n);\n\nconst PhoneIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n);\n\nconst RefreshIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n);\n\nconst LoaderIcon = () => (\n <svg className=\"w-4 h-4 animate-spin\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n);\n\nconst CopyIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n);\n\nconst CheckIcon = ({ className = '' }: { className?: string }) => (\n <svg className={`w-4 h-4 ${className}`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst XIcon = ({ className = '' }: { className?: string }) => (\n <svg className={`w-4 h-4 ${className}`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst BeakerIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\" />\n </svg>\n);\n\nconst ToolkitIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n);\n\nconst ChartIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\" />\n </svg>\n);\n\nconst SearchIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n);\n\nconst SignalIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8.111 16.404a5.5 5.5 0 017.778 0M12 20h.01m-7.08-7.071c3.904-3.905 10.236-3.905 14.141 0M1.394 9.393c5.857-5.857 15.355-5.857 21.213 0\" />\n </svg>\n);\n\nconst KeyIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z\" />\n </svg>\n);\n\nexport default PawapayTestDashboard;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/config.ts","../src/constants/errors.ts","../src/core/errors.ts","../src/config.ts","../src/core/retry.ts","../src/core/http-client.ts","../src/core/logger.ts","../src/constants/correspondents.ts","../src/modules/transactions.ts","../src/modules/products.ts","../src/modules/webhooks.ts","../src/modules/utils.ts","../src/modules/finances.ts","../src/sdk.ts","../src/mocks/webhook-generators.ts","../src/react.tsx"],"names":["DEFAULT_CONFIG","ERROR_CODES","ERROR_MAPPINGS","getErrorMapping","pawapayCode","m","PawapayError","_PawapayError","message","code","statusCode","options","originalError","mapping","configSchema","z","resolveConfig","config","result","errors","e","validated","baseUrl","getConfigFromEnv","env","envValue","timeout","retries","level","DEFAULT_RETRY_CONFIG","sleep","ms","resolve","calculateDelay","attempt","delay","jitter","withRetry","operation","logger","resolvedConfig","lastError","error","isNetworkError","msg","HttpClient","_HttpClient","axios","response","status","data","errorData","url","LOG_LEVELS","Logger","prefix","item","sanitized","sensitiveKeys","key","value","sk","formatted","CORRESPONDENTS","CORRESPONDENT_INFO","DEFAULT_LIMITS","depositRequestSchema","payoutRequestSchema","paymentPageRequestSchema","refundRequestSchema","TransactionsModule","httpClient","request","pawapayRequest","depositId","payoutId","transactionId","err","interval","maxAttempts","onStatusChange","lastStatus","filters","params","deposit","payout","productCreateSchema","domainAddSchema","ProductsModule","id","now","product","productId","p","updates","updatedProduct","domain","domainIndex","stored","WebhooksModule","secret","payload","signature","expectedSignature","createHmac","signatureBuffer","expectedBuffer","timingSafeEqual","event","eventType","UtilsModule","uuidv4","uuidValidate","uuidVersion","phoneNumber","correspondent","country","provider","currency","defaults","availability","depositStatus","op","payoutStatus","isOperational","isDelayed","isClosed","phone","countryCode","cleaned","info","statementRequestSchema","FinancesModule","statementId","SpaarkPayApiSdk","mergedConfig","generateUUID","c","r","generateDepositWebhook","amount","failureCode","failureMessage","generatePayoutWebhook","generateRefundWebhook","generateWebhook","WEBHOOK_EVENT_TYPES","createMockDepositResponse","txId","createMockPayoutResponse","createMockStatusResponse","createMockAvailabilityResponse","createMockPredictResponse","createMockActiveConfigResponse","createMockWalletBalancesResponse","createMockPublicKeysResponse","simulateDelay","computeHmacSha256","encoder","b","PROVIDER_OPTIONS","CURRENCY_OPTIONS","PawapayTestDashboard","initialApiKey","initialEnvironment","className","initialDemoMode","apiBasePath","onDepositComplete","onPayoutComplete","onError","apiKey","setApiKey","useState","environment","setEnvironment","isConfigured","setIsConfigured","isDemoMode","setIsDemoMode","activeTab","setActiveTab","setPhoneNumber","setAmount","setCurrency","setProvider","description","setDescription","setTransactionId","results","setResults","currentStatus","setCurrentStatus","webhookSecret","setWebhookSecret","webhookEvents","setWebhookEvents","webhookEventType","setWebhookEventType","webhookAmount","setWebhookAmount","webhookPhone","setWebhookPhone","webhookProvider","setWebhookProvider","generatedPayload","setGeneratedPayload","generatedSignature","setGeneratedSignature","verifyPayload","setVerifyPayload","verifySignature","setVerifySignature","verifySecret","setVerifySecret","verifyResult","setVerifyResult","parseInput","setParseInput","parsedEvent","setParsedEvent","parseError","setParseError","eventLogFilter","setEventLogFilter","addResult","useCallback","prev","handleConfigure","handleDemoMode","handleDeposit","res","handlePayout","handleCheckStatus","handleGetAvailability","handlePredictProvider","handleGetActiveConfig","handleGetPublicKeys","handleGetWalletBalances","copyToClipboard","text","jsxs","jsx","SettingsIcon","WalletIcon","PhoneIcon","RefreshIcon","ToolkitIcon","ChartIcon","WebhookIcon","LoaderIcon","PlayIcon","CopyIcon","SearchIcon","SignalIcon","KeyIcon","type","newEvent","parsedPayload","computedSignature","isValid","ShieldIcon","CheckIcon","XIcon","parsed","CodeIcon","BeakerIcon"],"mappings":"yRA0BO,IAAMA,CAAAA,CAAiB,CAC5B,OAAA,CAAS,GAAA,CACT,OAAA,CAAS,CAAA,CACT,UAAA,CAAY,GAAA,CACZ,QAAA,CAAU,MAAA,CACV,UAAA,CAAY,gCAAA,CACZ,aAAA,CAAe,wBACjB,CAAA,CCjCO,IAAMC,CAAAA,CAAc,CACzB,gBAAA,CAAkB,kBAAA,CAClB,aAAA,CAAe,eAAA,CACf,kBAAA,CAAoB,oBAAA,CACpB,cAAA,CAAgB,gBAAA,CAChB,eAAA,CAAiB,iBAAA,CACjB,cAAA,CAAgB,gBAAA,CAChB,SAAA,CAAW,WAAA,CACX,eAAA,CAAiB,iBAAA,CACjB,OAAA,CAAS,SAAA,CACT,YAAA,CAAc,cAAA,CACd,YAAA,CAAc,cAAA,CACd,YAAA,CAAc,cAAA,CACd,aAAA,CAAe,eAAA,CACf,SAAA,CAAW,WAAA,CACX,kBAAA,CAAoB,oBACtB,CAAA,CAYaC,EAAAA,CAAiC,CAC5C,CACE,WAAA,CAAa,sBAAA,CACb,OAAA,CAASD,CAAAA,CAAY,aAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,KAAA,CACX,OAAA,CAAS,6BACX,CAAA,CACA,CACE,WAAA,CAAa,oBAAA,CACb,OAAA,CAASA,CAAAA,CAAY,kBAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,KAAA,CACX,OAAA,CAAS,+BACX,CAAA,CACA,CACE,WAAA,CAAa,gBAAA,CACb,OAAA,CAASA,CAAAA,CAAY,cAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,KAAA,CACX,OAAA,CAAS,sBACX,CAAA,CACA,CACE,WAAA,CAAa,iBAAA,CACb,OAAA,CAASA,CAAAA,CAAY,eAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,KAAA,CACX,OAAA,CAAS,wBACX,CAAA,CACA,CACE,WAAA,CAAa,4BAAA,CACb,OAAA,CAASA,CAAAA,CAAY,cAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,KAAA,CACX,OAAA,CAAS,iCACX,CAAA,CACA,CACE,WAAA,CAAa,uBAAA,CACb,OAAA,CAASA,CAAAA,CAAY,SAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,KAAA,CACX,OAAA,CAAS,6BACX,CAAA,CACA,CACE,WAAA,CAAa,2BAAA,CACb,OAAA,CAASA,CAAAA,CAAY,eAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,IAAA,CACX,OAAA,CAAS,+CACX,CAAA,CACA,CACE,WAAA,CAAa,uCAAA,CACb,OAAA,CAASA,CAAAA,CAAY,eAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,IAAA,CACX,OAAA,CAAS,+CACX,CAAA,CACA,CACE,WAAA,CAAa,SAAA,CACb,OAAA,CAASA,CAAAA,CAAY,OAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,IAAA,CACX,OAAA,CAAS,uBACX,CAAA,CACA,CACE,WAAA,CAAa,iBAAA,CACb,OAAA,CAASA,CAAAA,CAAY,YAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,KAAA,CACX,OAAA,CAAS,4BACX,CAAA,CACA,CACE,WAAA,CAAa,qBAAA,CACb,OAAA,CAASA,CAAAA,CAAY,YAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,IAAA,CACX,OAAA,CAAS,mBACX,CAAA,CACA,CACE,WAAA,CAAa,gBAAA,CACb,OAAA,CAASA,CAAAA,CAAY,YAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,IAAA,CACX,OAAA,CAAS,wBACX,CAAA,CACA,CACE,WAAA,CAAa,oBAAA,CACb,OAAA,CAASA,CAAAA,CAAY,kBAAA,CACrB,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,KAAA,CACX,OAAA,CAAS,yCACX,CACF,EAEO,SAASE,EAAAA,CAAgBC,CAAAA,CAA+C,CAC7E,OAAOF,EAAAA,CAAe,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,WAAA,GAAgBD,CAAW,CACjE,CCzHO,IAAME,CAAAA,CAAN,MAAMC,CAAAA,SAAqB,KAAM,CAOtC,WAAA,CACEC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CAKA,CACA,KAAA,CAAMH,CAAO,CAAA,CACb,IAAA,CAAK,IAAA,CAAO,cAAA,CACZ,IAAA,CAAK,IAAA,CAAOC,CAAAA,CACZ,IAAA,CAAK,UAAA,CAAaC,CAAAA,CAClB,IAAA,CAAK,aAAA,CAAgBC,CAAAA,EAAS,aAAA,CAC9B,IAAA,CAAK,SAAA,CAAYA,CAAAA,EAAS,SAAA,EAAa,KAAA,CACvC,IAAA,CAAK,aAAA,CAAgBA,CAAAA,EAAS,aAAA,CAE1B,KAAA,CAAM,iBAAA,EACR,KAAA,CAAM,iBAAA,CAAkB,IAAA,CAAMJ,CAAY,EAE9C,CAEA,OAAO,mBAAA,CACLH,CAAAA,CACAI,CAAAA,CACAI,CAAAA,CACc,CACd,IAAMC,CAAAA,CAAUV,EAAAA,CAAgBC,CAAW,CAAA,CAE3C,OAAIS,CAAAA,CACK,IAAIN,CAAAA,CACTC,CAAAA,EAAWK,CAAAA,CAAQ,OAAA,CACnBA,CAAAA,CAAQ,OAAA,CACRA,CAAAA,CAAQ,UAAA,CACR,CACE,SAAA,CAAWA,CAAAA,CAAQ,SAAA,CACnB,aAAA,CAAAD,CACF,CACF,CAAA,CAGK,IAAIL,CAAAA,CACTC,CAAAA,EAAW,wBAAA,CACXP,CAAAA,CAAY,YAAA,CACZ,GAAA,CACA,CACE,SAAA,CAAW,KAAA,CACX,aAAA,CAAAW,CACF,CACF,CACF,CAEA,OAAO,UAAA,CAAWJ,CAAAA,CAA+B,CAC/C,OAAO,IAAID,CAAAA,CAAaC,CAAAA,CAASP,CAAAA,CAAY,gBAAA,CAAkB,GAAA,CAAK,CAClE,SAAA,CAAW,KACb,CAAC,CACH,CAEA,OAAO,OAAA,CAAQO,CAAAA,CAAiBI,CAAAA,CAAqC,CACnE,OAAO,IAAIL,CAAAA,CAAaC,CAAAA,CAASP,CAAAA,CAAY,aAAA,CAAe,CAAA,CAAG,CAC7D,SAAA,CAAW,IAAA,CACX,aAAA,CAAAW,CACF,CAAC,CACH,CAEA,OAAO,OAAA,CAAQJ,CAAAA,CAAkB,mBAAA,CAAmC,CAClE,OAAO,IAAID,CAAAA,CAAaC,CAAAA,CAASP,CAAAA,CAAY,OAAA,CAAS,GAAA,CAAK,CACzD,SAAA,CAAW,IACb,CAAC,CACH,CAEA,OAAO,YAAA,CAAaO,CAAAA,CAAkB,4BAAA,CAA4C,CAChF,OAAO,IAAID,CAAAA,CAAaC,CAAAA,CAASP,CAAAA,CAAY,YAAA,CAAc,GAAA,CAAK,CAC9D,SAAA,CAAW,KACb,CAAC,CACH,CAEA,OAAO,QAAA,CAASO,CAAAA,CAAkB,oBAAA,CAAoC,CACpE,OAAO,IAAID,CAAAA,CAAaC,CAAAA,CAASP,CAAAA,CAAY,SAAA,CAAW,GAAA,CAAK,CAC3D,SAAA,CAAW,KACb,CAAC,CACH,CAEA,MAAA,EAAkC,CAChC,OAAO,CACL,IAAA,CAAM,IAAA,CAAK,IAAA,CACX,OAAA,CAAS,IAAA,CAAK,OAAA,CACd,IAAA,CAAM,IAAA,CAAK,IAAA,CACX,UAAA,CAAY,IAAA,CAAK,UAAA,CACjB,aAAA,CAAe,IAAA,CAAK,aAAA,CACpB,SAAA,CAAW,IAAA,CAAK,SAClB,CACF,CACF,ECnGA,IAAMa,EAAAA,CAAeC,KAAAA,CAAE,MAAA,CAAO,CAC5B,MAAA,CAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAA,CAAG,qBAAqB,CAAA,CAC/C,WAAA,CAAaA,KAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,CAAW,YAAY,CAAC,CAAA,CAC7C,OAAA,CAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS,CACnC,WAAA,CAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS,CACvC,OAAA,CAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CAAE,GAAA,CAAI,GAAM,CAAA,CAAE,QAAA,EAAS,CACpD,OAAA,CAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA,EAAS,CAClD,UAAA,CAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CAAE,GAAA,CAAI,GAAK,CAAA,CAAE,QAAA,EAAS,CACtD,QAAA,CAAUA,KAAAA,CAAE,IAAA,CAAK,CAAC,OAAA,CAAS,MAAA,CAAQ,MAAA,CAAQ,OAAA,CAAS,MAAM,CAAC,CAAA,CAAE,QAAA,EAC/D,CAAC,CAAA,CAEM,SAASC,EAAAA,CAAcC,CAAAA,CAA+C,CAC3E,IAAMC,CAAAA,CAASJ,EAAAA,CAAa,SAAA,CAAUG,CAAM,CAAA,CAE5C,GAAI,CAACC,CAAAA,CAAO,OAAA,CAAS,CACnB,IAAMC,CAAAA,CAASD,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAKE,CAAAA,EAAM,CAAA,EAAGA,CAAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAKA,CAAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CACjF,MAAMd,CAAAA,CAAa,UAAA,CAAW,CAAA,2BAAA,EAA8Ba,CAAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CACjF,CAEA,IAAME,CAAAA,CAAYH,CAAAA,CAAO,IAAA,CAEnBI,CAAAA,CACJD,CAAAA,CAAU,OAAA,GACTA,CAAAA,CAAU,WAAA,GAAgB,YAAA,CACvBrB,CAAAA,CAAe,aAAA,CACfA,CAAAA,CAAe,UAAA,CAAA,CAErB,OAAO,CACL,MAAA,CAAQqB,CAAAA,CAAU,MAAA,CAClB,WAAA,CAAaA,CAAAA,CAAU,WAAA,CACvB,OAAA,CAAAC,CAAAA,CACA,WAAA,CAAaD,CAAAA,CAAU,WAAA,CACvB,OAAA,CAASA,CAAAA,CAAU,OAAA,EAAWrB,CAAAA,CAAe,OAAA,CAC7C,OAAA,CAASqB,CAAAA,CAAU,OAAA,EAAWrB,CAAAA,CAAe,OAAA,CAC7C,UAAA,CAAYqB,CAAAA,CAAU,UAAA,EAAcrB,CAAAA,CAAe,UAAA,CACnD,QAAA,CAAUqB,CAAAA,CAAU,QAAA,EAAYrB,CAAAA,CAAe,QACjD,CACF,CAEO,SAASuB,EAAAA,EAAmD,CACjE,IAAMC,CAAAA,CAAM,OAAO,OAAA,CAAY,GAAA,CAAc,OAAA,CAAQ,GAAA,CAAM,EAAC,CAEtDP,CAAAA,CAAyC,EAAC,CAMhD,GAJIO,CAAAA,CAAI,eAAA,GACNP,CAAAA,CAAO,MAAA,CAASO,CAAAA,CAAI,eAAA,CAAA,CAGlBA,CAAAA,CAAI,mBAAA,CAAwB,CAC9B,IAAMC,CAAAA,CAAWD,CAAAA,CAAI,mBAAA,CAAuB,WAAA,EAAY,CAAA,CACpDC,CAAAA,GAAa,YAAA,EAAgBA,CAAAA,GAAa,SAAA,IAC5CR,CAAAA,CAAO,WAAA,CAAcQ,CAAAA,EAEzB,CAUA,GARID,CAAAA,CAAI,gBAAA,GACNP,CAAAA,CAAO,OAAA,CAAUO,CAAAA,CAAI,gBAAA,CAAA,CAGnBA,CAAAA,CAAI,oBAAA,GACNP,CAAAA,CAAO,WAAA,CAAcO,CAAAA,CAAI,oBAAA,CAAA,CAGvBA,CAAAA,CAAI,eAAA,CAAoB,CAC1B,IAAME,CAAAA,CAAU,QAAA,CAASF,CAAAA,CAAI,eAAA,CAAoB,EAAE,CAAA,CAC9C,KAAA,CAAME,CAAO,CAAA,GAChBT,CAAAA,CAAO,OAAA,CAAUS,CAAAA,EAErB,CAEA,GAAIF,CAAAA,CAAI,eAAA,CAAoB,CAC1B,IAAMG,CAAAA,CAAU,QAAA,CAASH,CAAAA,CAAI,eAAA,CAAoB,EAAE,CAAA,CAC9C,KAAA,CAAMG,CAAO,CAAA,GAChBV,CAAAA,CAAO,OAAA,CAAUU,CAAAA,EAErB,CAEA,GAAIH,CAAAA,CAAI,iBAAA,CAAsB,CAC5B,IAAMI,CAAAA,CAAQJ,CAAAA,CAAI,iBAAA,CAAqB,WAAA,EAAY,CAC/C,CAAC,OAAA,CAAS,MAAA,CAAQ,MAAA,CAAQ,OAAA,CAAS,MAAM,CAAA,CAAE,QAAA,CAASI,CAAK,CAAA,GAC3DX,CAAAA,CAAO,QAAA,CAAWW,CAAAA,EAEtB,CAEA,OAAOX,CACT,CChFA,IAAMY,EAAAA,CAA8C,CAClD,WAAA,CAAa,CAAA,CACb,YAAA,CAAc,GAAA,CACd,QAAA,CAAU,GAAA,CACV,iBAAA,CAAmB,CACrB,CAAA,CAEA,SAASC,EAAAA,CAAMC,CAAAA,CAA2B,CACxC,OAAO,IAAI,OAAA,CAASC,CAAAA,EAAY,UAAA,CAAWA,CAAAA,CAASD,CAAE,CAAC,CACzD,CAEA,SAASE,EAAAA,CAAeC,CAAAA,CAAiBjB,CAAAA,CAAuC,CAC9E,IAAMkB,CAAAA,CAAQlB,CAAAA,CAAO,YAAA,CAAe,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAO,iBAAA,CAAmBiB,CAAAA,CAAU,CAAC,CAAA,CAC5EE,CAAAA,CAAS,IAAA,CAAK,MAAA,EAAO,CAAI,EAAA,CAAMD,CAAAA,CACrC,OAAO,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAQC,CAAAA,CAAQnB,CAAAA,CAAO,QAAQ,CACjD,CAEA,eAAsBoB,CAAAA,CACpBC,CAAAA,CACArB,CAAAA,CAA+B,EAAC,CAChCsB,CAAAA,CACY,CACZ,IAAMC,CAAAA,CAAwC,CAC5C,GAAGX,EAAAA,CACH,GAAGZ,CACL,CAAA,CAEIwB,CAAAA,CAEJ,IAAA,IAASP,CAAAA,CAAU,CAAA,CAAGA,CAAAA,EAAWM,CAAAA,CAAe,WAAA,CAAaN,CAAAA,EAAAA,CAC3D,GAAI,CACF,OAAO,MAAMI,CAAAA,EACf,CAAA,MAASI,CAAAA,CAAO,CAQd,GAPAD,CAAAA,CAAYC,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAA,CAOhE,EAJFA,CAAAA,YAAiBpC,CAAAA,CACboC,CAAAA,CAAM,SAAA,CACNC,EAAAA,CAAeD,CAAK,CAAA,CAAA,EAENR,CAAAA,GAAYM,CAAAA,CAAe,WAAA,CAC7C,MAAME,CAAAA,CAGR,IAAMP,CAAAA,CAAQF,EAAAA,CAAeC,CAAAA,CAASM,CAAc,CAAA,CAEpDD,CAAAA,EAAQ,IAAA,CACN,CAAA,QAAA,EAAWL,CAAO,CAAA,CAAA,EAAIM,CAAAA,CAAe,WAAW,CAAA,qBAAA,EAAwB,IAAA,CAAK,KAAA,CAAML,CAAK,CAAC,CAAA,EAAA,CAAA,CACzF,CAAE,KAAA,CAAOM,CAAAA,CAAU,OAAQ,CAC7B,CAAA,CAEA,MAAMX,EAAAA,CAAMK,CAAK,EACnB,CAGF,MAAMM,CAAAA,EAAa,IAAI,KAAA,CAAM,4BAA4B,CAC3D,CAEA,SAASE,EAAAA,CAAeD,CAAAA,CAAyB,CAC/C,OAAIA,CAAAA,YAAiBpC,CAAAA,CACZoC,CAAAA,CAAM,SAAA,CAGXA,CAAAA,YAAiB,KAAA,CACU,CAC3B,YAAA,CACA,cAAA,CACA,WAAA,CACA,WAAA,CACA,eAAA,CACA,SAAA,CACA,gBACF,CAAA,CAE4B,IAAA,CACzBE,CAAAA,EACCF,CAAAA,CAAM,OAAA,CAAQ,QAAA,CAASE,CAAG,CAAA,EACzBF,CAAAA,CAAgC,IAAA,GAASE,CAC9C,CAAA,CAGK,KACT,CClEO,IAAMC,CAAAA,CAAN,MAAMC,CAAW,CAMtB,WAAA,CAAY7B,CAAAA,CAA0B,CACpC,IAAA,CAAK,MAAA,CAASA,CAAAA,CAAO,MAAA,CACrB,IAAA,CAAK,OAAA,CAAUA,CAAAA,CAAO,OAAA,CACtB,IAAA,CAAK,UAAA,CAAaA,CAAAA,CAAO,UAAA,CAEzB,IAAA,CAAK,MAAA,CAAS8B,mBAAAA,CAAM,MAAA,CAAO,CACzB,OAAA,CAAS9B,CAAAA,CAAO,OAAA,CAChB,OAAA,CAASA,CAAAA,CAAO,OAAA,CAChB,OAAA,CAAS,CACP,cAAA,CAAgB,kBAAA,CAChB,aAAA,CAAe,CAAA,OAAA,EAAUA,CAAAA,CAAO,MAAM,CAAA,CACxC,CACF,CAAC,CAAA,CAED,IAAA,CAAK,iBAAA,GACP,CAEQ,iBAAA,EAA0B,CAChC,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAA,CAC9BA,CAAAA,GACC,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAGA,CAAAA,CAAO,MAAA,EAAQ,WAAA,EAAa,CAAA,CAAA,EAAIA,CAAAA,CAAO,GAAG,CAAA,CAAA,CAAI,CACjE,MAAA,CAAQA,CAAAA,CAAO,MACjB,CAAC,CAAA,CACMA,CAAAA,CAAAA,CAERyB,CAAAA,GACC,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,eAAA,CAAiBA,CAAK,CAAA,CACjC,OAAA,CAAQ,MAAA,CAAOA,CAAK,CAAA,CAE/B,CAAA,CAEA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,QAAA,CAAS,GAAA,CAC/BM,CAAAA,GACC,IAAA,CAAK,MAAA,CAAO,KAAA,CACV,CAAA,EAAGA,CAAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,WAAA,EAAa,CAAA,CAAA,EAAIA,CAAAA,CAAS,MAAA,CAAO,GAAG,CAAA,IAAA,EAAOA,CAAAA,CAAS,MAAM,CAAA,CAAA,CACrF,CAAE,IAAA,CAAMA,CAAAA,CAAS,IAAK,CACxB,CAAA,CACOA,CAAAA,CAAAA,CAERN,CAAAA,GACKK,mBAAAA,CAAM,YAAA,CAAaL,CAAK,CAAA,EAC1B,IAAA,CAAK,MAAA,CAAO,KAAA,CACV,CAAA,gBAAA,EAAmBA,CAAAA,CAAM,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAa,CAAA,CAAA,EAAIA,CAAAA,CAAM,MAAA,EAAQ,GAAG,CAAA,CAAA,CAC3E,CACE,MAAA,CAAQA,CAAAA,CAAM,QAAA,EAAU,MAAA,CACxB,IAAA,CAAMA,CAAAA,CAAM,QAAA,EAAU,IACxB,CACF,CAAA,CAEK,OAAA,CAAQ,MAAA,CAAOA,CAAK,CAAA,CAE/B,EACF,CAEQ,WAAA,CAAYA,CAAAA,CAAuB,CACzC,GAAIK,mBAAAA,CAAM,YAAA,CAAaL,CAAK,CAAA,CAAG,CAC7B,GAAIA,CAAAA,CAAM,IAAA,GAAS,cAAA,EAAkBA,CAAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,CACnE,MAAMpC,CAAAA,CAAa,OAAA,EAAQ,CAG7B,GAAI,CAACoC,CAAAA,CAAM,QAAA,CACT,MAAMpC,CAAAA,CAAa,OAAA,CACjBoC,CAAAA,CAAM,OAAA,EAAW,eAAA,CACjBA,CACF,CAAA,CAGF,GAAM,CAAE,MAAA,CAAAO,CAAAA,CAAQ,IAAA,CAAAC,CAAK,CAAA,CAAIR,CAAAA,CAAM,QAAA,CACzBS,CAAAA,CAAYD,CAAAA,CAElB,GAAID,CAAAA,GAAW,GAAA,CACb,MAAM3C,CAAAA,CAAa,YAAA,EAAa,CAGlC,GAAI2C,CAAAA,GAAW,GAAA,CACb,MAAM3C,CAAAA,CAAa,QAAA,EAAS,CAG9B,IAAMF,CAAAA,CACJ+C,CAAAA,EAAW,SAAA,EACXA,CAAAA,EAAW,eAAA,EAAiB,aAAA,CAE9B,MAAI/C,CAAAA,CACIE,CAAAA,CAAa,mBAAA,CACjBF,CAAAA,CACA+C,CAAAA,EAAW,YAAA,EAAgBA,CAAAA,EAAW,eAAA,EAAiB,gBAAA,CACvDT,CACF,CAAA,CAGI,IAAIpC,CAAAA,CACR6C,CAAAA,EAAW,YAAA,EAAgB,CAAA,WAAA,EAAcF,CAAM,CAAA,CAAA,CAC/C,cAAA,CACAA,CAAAA,CACA,CACE,SAAA,CAAWA,CAAAA,EAAU,GAAA,CACrB,aAAA,CAAeP,CACjB,CACF,CACF,CAEA,MAAIA,CAAAA,YAAiBpC,CAAAA,CACboC,CAAAA,CAGFpC,CAAAA,CAAa,OAAA,CACjBoC,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,eAAA,CACzCA,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,MACnC,CACF,CAEA,MAAM,GAAA,CAAOU,CAAAA,CAAanC,CAAAA,CAAyC,CACjE,OAAOoB,CAAAA,CACL,SAAY,CACV,GAAI,CAEF,OAAA,CADmC,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAIe,CAAAA,CAAKnC,CAAM,CAAA,EACpD,IAClB,CAAA,MAASyB,CAAAA,CAAO,CACd,IAAA,CAAK,WAAA,CAAYA,CAAK,EACxB,CACF,CAAA,CACA,CAAE,WAAA,CAAa,IAAA,CAAK,OAAA,CAAS,YAAA,CAAc,IAAA,CAAK,UAAW,CAAA,CAC3D,IAAA,CAAK,MACP,CACF,CAEA,MAAM,IAAA,CAAqBU,CAAAA,CAAaF,CAAAA,CAAUjC,CAAAA,CAAyC,CACzF,OAAOoB,CAAAA,CACL,SAAY,CACV,GAAI,CAEF,OAAA,CADmC,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAKe,CAAAA,CAAKF,CAAAA,CAAMjC,CAAM,CAAA,EAC3D,IAClB,CAAA,MAASyB,CAAAA,CAAO,CACd,IAAA,CAAK,WAAA,CAAYA,CAAK,EACxB,CACF,CAAA,CACA,CAAE,WAAA,CAAa,IAAA,CAAK,OAAA,CAAS,YAAA,CAAc,IAAA,CAAK,UAAW,CAAA,CAC3D,IAAA,CAAK,MACP,CACF,CAEA,MAAM,GAAA,CAAoBU,CAAAA,CAAaF,CAAAA,CAAUjC,CAAAA,CAAyC,CACxF,OAAOoB,CAAAA,CACL,SAAY,CACV,GAAI,CAEF,OAAA,CADmC,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAIe,CAAAA,CAAKF,CAAAA,CAAMjC,CAAM,CAAA,EAC1D,IAClB,CAAA,MAASyB,CAAAA,CAAO,CACd,IAAA,CAAK,WAAA,CAAYA,CAAK,EACxB,CACF,CAAA,CACA,CAAE,WAAA,CAAa,IAAA,CAAK,OAAA,CAAS,YAAA,CAAc,IAAA,CAAK,UAAW,CAAA,CAC3D,IAAA,CAAK,MACP,CACF,CAEA,MAAM,MAAA,CAAUU,CAAAA,CAAanC,CAAAA,CAAyC,CACpE,OAAOoB,CAAAA,CACL,SAAY,CACV,GAAI,CAEF,OAAA,CADmC,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAOe,CAAAA,CAAKnC,CAAM,CAAA,EACvD,IAClB,CAAA,MAASyB,CAAAA,CAAO,CACd,IAAA,CAAK,WAAA,CAAYA,CAAK,EACxB,CACF,CAAA,CACA,CAAE,WAAA,CAAa,IAAA,CAAK,OAAA,CAAS,YAAA,CAAc,IAAA,CAAK,UAAW,CAAA,CAC3D,IAAA,CAAK,MACP,CACF,CAEA,OAAO,UAAA,CAAWzB,CAAAA,CAAwBsB,CAAAA,CAA4B,CACpE,OAAO,IAAIO,CAAAA,CAAW,CACpB,OAAA,CAAS7B,CAAAA,CAAO,OAAA,CAChB,MAAA,CAAQA,CAAAA,CAAO,MAAA,CACf,OAAA,CAASA,CAAAA,CAAO,OAAA,CAChB,OAAA,CAASA,CAAAA,CAAO,OAAA,CAChB,UAAA,CAAYA,CAAAA,CAAO,UAAA,CACnB,MAAA,CAAAsB,CACF,CAAC,CACH,CACF,CAAA,CCnNA,IAAMc,EAAAA,CAAuC,CAC3C,KAAA,CAAO,CAAA,CACP,IAAA,CAAM,CAAA,CACN,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,IAAA,CAAM,CACR,CAAA,CAEaC,CAAAA,CAAN,KAAa,CAIlB,WAAA,CAAYC,CAAAA,CAAgB3B,CAAAA,CAAkB,MAAA,CAAQ,CACpD,IAAA,CAAK,MAAA,CAAS2B,CAAAA,CACd,IAAA,CAAK,KAAA,CAAQ3B,EACf,CAEA,QAAA,CAASA,CAAAA,CAAuB,CAC9B,IAAA,CAAK,KAAA,CAAQA,EACf,CAEQ,SAAA,CAAUA,CAAAA,CAA0B,CAC1C,OAAOyB,EAAAA,CAAWzB,CAAK,CAAA,EAAKyB,EAAAA,CAAW,IAAA,CAAK,KAAK,CACnD,CAEQ,aAAA,CAAczB,CAAAA,CAAepB,CAAAA,CAAyB,CAE5D,OAAO,CAAA,CAAA,EADW,IAAI,IAAA,EAAK,CAAE,WAAA,EACT,CAAA,EAAA,EAAKoB,CAAAA,CAAM,WAAA,EAAY,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,EAAA,EAAKpB,CAAO,CAAA,CACpF,CAEQ,QAAA,CAAS0C,CAAAA,CAAwB,CASvC,GARIA,CAAAA,EAAS,IAAA,EAIT,OAAOA,CAAAA,EAAS,QAAA,EAIhB,OAAOA,CAAAA,EAAS,QAAA,CAClB,OAAOA,CAAAA,CAGT,GAAI,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,CACpB,OAAOA,CAAAA,CAAK,GAAA,CAAKM,CAAAA,EAAS,IAAA,CAAK,QAAA,CAASA,CAAI,CAAC,CAAA,CAG/C,IAAMC,CAAAA,CAAqC,EAAC,CACtCC,CAAAA,CAAgB,CAAC,QAAA,CAAU,SAAA,CAAW,eAAA,CAAiB,UAAA,CAAY,QAAA,CAAU,OAAO,CAAA,CAE1F,IAAA,GAAW,CAACC,CAAAA,CAAKC,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQV,CAA+B,CAAA,CACnEQ,CAAAA,CAAc,IAAA,CAAMG,CAAAA,EAAOF,CAAAA,CAAI,WAAA,EAAY,CAAE,QAAA,CAASE,CAAE,CAAC,CAAA,CAC3DJ,CAAAA,CAAUE,CAAG,CAAA,CAAI,YAAA,CACR,OAAOC,CAAAA,EAAU,QAAA,EAAYA,CAAAA,GAAU,IAAA,CAChDH,CAAAA,CAAUE,CAAG,CAAA,CAAI,IAAA,CAAK,QAAA,CAASC,CAAK,CAAA,CAEpCH,CAAAA,CAAUE,CAAG,CAAA,CAAIC,CAAAA,CAIrB,OAAOH,CACT,CAEA,KAAA,CAAMjD,CAAAA,CAAiB0C,CAAAA,CAAsB,CAC3C,GAAI,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,CAAG,CAC3B,IAAMY,CAAAA,CAAY,IAAA,CAAK,aAAA,CAAc,OAAA,CAAStD,CAAO,CAAA,CACjD0C,CAAAA,GAAS,MAAA,CACX,OAAA,CAAQ,KAAA,CAAMY,CAAAA,CAAW,IAAA,CAAK,QAAA,CAASZ,CAAI,CAAC,CAAA,CAE5C,OAAA,CAAQ,KAAA,CAAMY,CAAS,EAE3B,CACF,CAEA,IAAA,CAAKtD,CAAAA,CAAiB0C,CAAAA,CAAsB,CAC1C,GAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,CAAG,CAC1B,IAAMY,CAAAA,CAAY,IAAA,CAAK,aAAA,CAAc,MAAA,CAAQtD,CAAO,CAAA,CAChD0C,CAAAA,GAAS,MAAA,CACX,OAAA,CAAQ,IAAA,CAAKY,CAAAA,CAAW,IAAA,CAAK,QAAA,CAASZ,CAAI,CAAC,CAAA,CAE3C,OAAA,CAAQ,IAAA,CAAKY,CAAS,EAE1B,CACF,CAEA,IAAA,CAAKtD,CAAAA,CAAiB0C,CAAAA,CAAsB,CAC1C,GAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,CAAG,CAC1B,IAAMY,CAAAA,CAAY,IAAA,CAAK,aAAA,CAAc,MAAA,CAAQtD,CAAO,CAAA,CAChD0C,CAAAA,GAAS,MAAA,CACX,OAAA,CAAQ,IAAA,CAAKY,CAAAA,CAAW,IAAA,CAAK,QAAA,CAASZ,CAAI,CAAC,CAAA,CAE3C,OAAA,CAAQ,IAAA,CAAKY,CAAS,EAE1B,CACF,CAEA,KAAA,CAAMtD,CAAAA,CAAiBkC,CAAAA,CAA+B,CACpD,GAAI,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,CAAG,CAC3B,IAAMoB,CAAAA,CAAY,IAAA,CAAK,aAAA,CAAc,OAAA,CAAStD,CAAO,CAAA,CACjDkC,CAAAA,GAAU,MAAA,CACZ,OAAA,CAAQ,KAAA,CAAMoB,CAAAA,CAAW,IAAA,CAAK,QAAA,CAASpB,CAAK,CAAC,CAAA,CAE7C,OAAA,CAAQ,KAAA,CAAMoB,CAAS,EAE3B,CACF,CACF,ECpGO,IAAMC,CAAAA,CAAiB,CAC5B,cAAA,CACA,YAAA,CACA,cAAA,CACA,YAAA,CACA,cAAA,CACA,YACF,CAAA,CAcaC,CAAAA,CAA+D,CAC1E,YAAA,CAAc,CACZ,aAAA,CAAe,cAAA,CACf,IAAA,CAAM,kBAAA,CACN,OAAA,CAAS,UAAA,CACT,WAAA,CAAa,KAAA,CACb,QAAA,CAAU,KAAA,CACV,QAAA,CAAU,CAAC,SAAA,CAAW,QAAA,CAAU,QAAQ,CAAA,CACxC,UAAA,CAAY,2BACd,CAAA,CACA,UAAA,CAAY,CACV,aAAA,CAAe,YAAA,CACf,IAAA,CAAM,cAAA,CACN,OAAA,CAAS,UAAA,CACT,WAAA,CAAa,KAAA,CACb,QAAA,CAAU,KAAA,CACV,QAAA,CAAU,CAAC,SAAA,CAAW,QAAA,CAAU,QAAQ,CAAA,CACxC,UAAA,CAAY,wBACd,CAAA,CACA,YAAA,CAAc,CACZ,aAAA,CAAe,cAAA,CACf,IAAA,CAAM,kBAAA,CACN,OAAA,CAAS,OAAA,CACT,WAAA,CAAa,KAAA,CACb,QAAA,CAAU,KAAA,CACV,QAAA,CAAU,CAAC,SAAA,CAAW,QAAA,CAAU,QAAQ,CAAA,CACxC,UAAA,CAAY,sBACd,CAAA,CACA,UAAA,CAAY,CACV,aAAA,CAAe,YAAA,CACf,IAAA,CAAM,cAAA,CACN,OAAA,CAAS,OAAA,CACT,WAAA,CAAa,KAAA,CACb,QAAA,CAAU,KAAA,CACV,QAAA,CAAU,CAAC,SAAA,CAAW,QAAQ,CAAA,CAC9B,UAAA,CAAY,sBACd,CAAA,CACA,YAAA,CAAc,CACZ,aAAA,CAAe,cAAA,CACf,IAAA,CAAM,kBAAA,CACN,OAAA,CAAS,OAAA,CACT,WAAA,CAAa,KAAA,CACb,QAAA,CAAU,KAAA,CACV,QAAA,CAAU,CAAC,SAAA,CAAW,QAAA,CAAU,QAAQ,CAAA,CACxC,UAAA,CAAY,mBACd,CAAA,CACA,UAAA,CAAY,CACV,aAAA,CAAe,YAAA,CACf,IAAA,CAAM,cAAA,CACN,OAAA,CAAS,OAAA,CACT,WAAA,CAAa,KAAA,CACb,QAAA,CAAU,KAAA,CACV,QAAA,CAAU,CAAC,SAAA,CAAW,QAAQ,CAAA,CAC9B,UAAA,CAAY,mBACd,CACF,CAAA,CAYaC,CAAAA,CAA2D,CACtE,YAAA,CAAc,CACZ,UAAA,CAAY,GAAA,CACZ,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,GAAA,CACX,SAAA,CAAW,GAAA,CACX,QAAA,CAAU,KAAA,CACV,UAAA,CAAY,GACd,CAAA,CACA,UAAA,CAAY,CACV,UAAA,CAAY,GAAA,CACZ,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,GAAA,CACX,SAAA,CAAW,GAAA,CACX,QAAA,CAAU,KAAA,CACV,UAAA,CAAY,GACd,CAAA,CACA,YAAA,CAAc,CACZ,UAAA,CAAY,GAAA,CACZ,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,GAAA,CACX,SAAA,CAAW,GAAA,CACX,QAAA,CAAU,KAAA,CACV,UAAA,CAAY,GACd,CAAA,CACA,UAAA,CAAY,CACV,UAAA,CAAY,GAAA,CACZ,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,GAAA,CACX,SAAA,CAAW,GAAA,CACX,QAAA,CAAU,KAAA,CACV,UAAA,CAAY,GACd,CAAA,CACA,YAAA,CAAc,CACZ,UAAA,CAAY,GAAA,CACZ,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,GAAA,CACX,SAAA,CAAW,GAAA,CACX,QAAA,CAAU,KAAA,CACV,UAAA,CAAY,GACd,CAAA,CACA,UAAA,CAAY,CACV,UAAA,CAAY,GAAA,CACZ,UAAA,CAAY,GAAA,CACZ,SAAA,CAAW,GAAA,CACX,SAAA,CAAW,GAAA,CACX,QAAA,CAAU,KAAA,CACV,UAAA,CAAY,GACd,CACF,EC3HA,IAAMC,EAAAA,CAAuBnD,KAAAA,CAAE,MAAA,CAAO,CACpC,MAAA,CAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,yBAAyB,CAAA,CAAE,GAAA,CAAI,GAAU,CAAA,CACrE,QAAA,CAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CACjC,QAAA,CAAUA,KAAAA,CAAE,IAAA,CAAKgD,CAAc,CAAA,CAC/B,WAAA,CAAahD,KAAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,eAAA,CAAiB,kCAAkC,CAAA,CACjF,aAAA,CAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK,CAC/B,oBAAA,CAAsBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CAC1C,iBAAA,CAAmBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CACvC,eAAA,CAAiBA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA,EAAS,CACpD,QAAA,CAAUA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,OAAA,EAAS,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA,EACnD,CAAC,CAAA,CAEKoD,EAAAA,CAAsBpD,KAAAA,CAAE,MAAA,CAAO,CACnC,MAAA,CAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,yBAAyB,CAAA,CAAE,GAAA,CAAI,GAAU,CAAA,CACrE,QAAA,CAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CACjC,QAAA,CAAUA,KAAAA,CAAE,IAAA,CAAKgD,CAAc,CAAA,CAC/B,WAAA,CAAahD,KAAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,eAAA,CAAiB,kCAAkC,CAAA,CACjF,aAAA,CAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK,CAC/B,iBAAA,CAAmBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CACvC,eAAA,CAAiBA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA,EAAS,CACpD,QAAA,CAAUA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,OAAA,EAAS,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA,EACnD,CAAC,CAAA,CAEKqD,EAAAA,CAA2BrD,KAAAA,CAAE,MAAA,CAAO,CACxC,SAAA,CAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK,CAC3B,SAAA,CAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAC1B,WAAA,CAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CACjC,aAAA,CAAeA,KAAAA,CAAE,MAAA,CAAO,CACtB,MAAA,CAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CAC5B,QAAA,CAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,CAAC,CAC/B,CAAC,CAAA,CAAE,QAAA,EAAS,CACZ,QAAA,CAAUA,KAAAA,CAAE,IAAA,CAAK,CAAC,IAAA,CAAM,IAAI,CAAC,CAAA,CAAE,QAAA,EAAS,CACxC,OAAA,CAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAS,CACvC,MAAA,CAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA,EAAS,CACpC,eAAA,CAAiBA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA,EAAS,CACpD,QAAA,CAAUA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,OAAA,EAAS,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA,EACnD,CAAC,CAAA,CAEKsD,EAAAA,CAAsBtD,KAAAA,CAAE,MAAA,CAAO,CACnC,SAAA,CAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK,CAC3B,MAAA,CAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,yBAAyB,CAAA,CACrD,aAAA,CAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAC5B,CAAC,CAAA,CAmID,SAASe,EAAAA,CAAMC,CAAAA,CAA2B,CACxC,OAAO,IAAI,OAAA,CAASC,CAAAA,EAAY,UAAA,CAAWA,CAAAA,CAASD,CAAE,CAAC,CACzD,CAEO,IAAMuC,CAAAA,CAAN,KAAyB,CAC9B,WAAA,CACmBC,CAAAA,CACAhC,CAAAA,CACjB,CAFiB,IAAA,CAAA,UAAA,CAAAgC,CAAAA,CACA,IAAA,CAAA,MAAA,CAAAhC,EAChB,CAKH,MAAM,eAAA,CAAgBiC,CAAAA,CAAmD,CACvE,IAAMnD,CAAAA,CAAY6C,EAAAA,CAAqB,KAAA,CAAMM,CAAO,CAAA,CAE9CC,CAAAA,CAA0C,CAC9C,SAAA,CAAWpD,CAAAA,CAAU,aAAA,CACrB,MAAA,CAAQA,CAAAA,CAAU,MAAA,CAAO,QAAA,EAAS,CAClC,QAAA,CAAUA,CAAAA,CAAU,QAAA,CACpB,KAAA,CAAO,CACL,IAAA,CAAM,KAAA,CACN,cAAA,CAAgB,CACd,WAAA,CAAaA,CAAAA,CAAU,WAAA,CACvB,QAAA,CAAUA,CAAAA,CAAU,QACtB,CACF,CAAA,CACA,oBAAA,CAAsBA,CAAAA,CAAU,oBAAA,CAChC,iBAAA,CAAmBA,CAAAA,CAAU,iBAAA,CAC7B,eAAA,CAAiBA,CAAAA,CAAU,eAAA,CAC3B,QAAA,CAAUA,CAAAA,CAAU,QACtB,CAAA,CAEA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,sBAAA,EAAyBA,CAAAA,CAAU,aAAa,CAAA,CAAA,CAAI,CACnE,MAAA,CAAQA,CAAAA,CAAU,MAAA,CAClB,QAAA,CAAUA,CAAAA,CAAU,QAAA,CACpB,QAAA,CAAUA,CAAAA,CAAU,QACtB,CAAC,CAAA,CAED,IAAM2B,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CACrC,cAAA,CACAyB,CACF,CAAA,CAEA,GAAIzB,CAAAA,CAAS,MAAA,GAAW,UAAA,EAAcA,CAAAA,CAAS,eAAA,CAC7C,MAAM1C,CAAAA,CAAa,mBAAA,CACjB0C,CAAAA,CAAS,eAAA,CAAgB,aAAA,CACzBA,CAAAA,CAAS,eAAA,CAAgB,gBAC3B,CAAA,CAGF,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAWA,CAAAA,CAAS,SAAS,CAAA,SAAA,EAAYA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAEpE,CACL,SAAA,CAAWA,CAAAA,CAAS,SAAA,CACpB,MAAA,CAAQA,CAAAA,CAAS,MAAA,CACjB,OAAA,CAASA,CAAAA,CAAS,OAAA,EAAW,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CACpD,QAAA,CAAUA,CAAAA,CAAS,QAAA,CACnB,WAAA,CAAaA,CAAAA,CAAS,WACxB,CACF,CAKA,MAAM,cAAA,CAAewB,CAAAA,CAAiD,CACpE,IAAMnD,CAAAA,CAAY8C,EAAAA,CAAoB,KAAA,CAAMK,CAAO,CAAA,CAE7CC,CAAAA,CAAyC,CAC7C,QAAA,CAAUpD,CAAAA,CAAU,aAAA,CACpB,MAAA,CAAQA,CAAAA,CAAU,MAAA,CAAO,QAAA,EAAS,CAClC,QAAA,CAAUA,CAAAA,CAAU,QAAA,CACpB,SAAA,CAAW,CACT,IAAA,CAAM,KAAA,CACN,cAAA,CAAgB,CACd,WAAA,CAAaA,CAAAA,CAAU,WAAA,CACvB,QAAA,CAAUA,CAAAA,CAAU,QACtB,CACF,CAAA,CACA,iBAAA,CAAmBA,CAAAA,CAAU,iBAAA,CAC7B,eAAA,CAAiBA,CAAAA,CAAU,eAAA,CAC3B,QAAA,CAAUA,CAAAA,CAAU,QACtB,CAAA,CAEA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,qBAAA,EAAwBA,CAAAA,CAAU,aAAa,CAAA,CAAA,CAAI,CAClE,MAAA,CAAQA,CAAAA,CAAU,MAAA,CAClB,QAAA,CAAUA,CAAAA,CAAU,QAAA,CACpB,QAAA,CAAUA,CAAAA,CAAU,QACtB,CAAC,CAAA,CAED,IAAM2B,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CACrC,aAAA,CACAyB,CACF,CAAA,CAEA,GAAIzB,CAAAA,CAAS,MAAA,GAAW,UAAA,EAAcA,CAAAA,CAAS,eAAA,CAC7C,MAAM1C,CAAAA,CAAa,mBAAA,CACjB0C,CAAAA,CAAS,eAAA,CAAgB,aAAA,CACzBA,CAAAA,CAAS,eAAA,CAAgB,gBAC3B,CAAA,CAGF,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAUA,CAAAA,CAAS,QAAQ,CAAA,SAAA,EAAYA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAElE,CACL,QAAA,CAAUA,CAAAA,CAAS,QAAA,CACnB,MAAA,CAAQA,CAAAA,CAAS,MAAA,CACjB,OAAA,CAASA,CAAAA,CAAS,OAAA,EAAW,IAAI,IAAA,EAAK,CAAE,WAAA,EAC1C,CACF,CAKA,MAAM,iBAAA,CAAkBwB,CAAAA,CAA2D,CACjF,IAAMnD,CAAAA,CAAY+C,EAAAA,CAAyB,KAAA,CAAMI,CAAO,CAAA,CAElDC,CAAAA,CAA8C,CAClD,SAAA,CAAWpD,CAAAA,CAAU,SAAA,CACrB,SAAA,CAAWA,CAAAA,CAAU,SAAA,CACrB,WAAA,CAAaA,CAAAA,CAAU,WAAA,CACvB,aAAA,CAAeA,CAAAA,CAAU,aAAA,CACrB,CACE,MAAA,CAAQA,CAAAA,CAAU,aAAA,CAAc,MAAA,CAAO,QAAA,EAAS,CAChD,QAAA,CAAUA,CAAAA,CAAU,aAAA,CAAc,QACpC,CAAA,CACA,MAAA,CACJ,QAAA,CAAUA,CAAAA,CAAU,QAAA,CACpB,OAAA,CAASA,CAAAA,CAAU,OAAA,CACnB,MAAA,CAAQA,CAAAA,CAAU,MAAA,CAClB,eAAA,CAAiBA,CAAAA,CAAU,eAAA,CAC3B,QAAA,CAAUA,CAAAA,CAAU,QACtB,CAAA,CAEA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,kCAAA,EAAqCA,CAAAA,CAAU,SAAS,CAAA,CAAE,CAAA,CAE3E,IAAM2B,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CACrC,iBAAA,CACAyB,CACF,CAAA,CAEA,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,sBAAA,EAAyBzB,CAAAA,CAAS,WAAW,CAAA,CAAE,CAAA,CAEzD,CACL,WAAA,CAAaA,CAAAA,CAAS,WACxB,CACF,CAKA,MAAM,MAAA,CAAOwB,CAAAA,CAAiD,CAC5D,IAAMnD,CAAAA,CAAYgD,EAAAA,CAAoB,KAAA,CAAMG,CAAO,CAAA,CAE7CC,CAAAA,CAAuC,CAC3C,QAAA,CAAUpD,CAAAA,CAAU,aAAA,CACpB,SAAA,CAAWA,CAAAA,CAAU,SAAA,CACrB,MAAA,CAAQA,CAAAA,CAAU,MAAA,CAAO,QAAA,EAC3B,CAAA,CAEA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,kBAAA,EAAqBA,CAAAA,CAAU,aAAa,CAAA,CAAA,CAAI,CAC/D,SAAA,CAAWA,CAAAA,CAAU,SAAA,CACrB,MAAA,CAAQA,CAAAA,CAAU,MACpB,CAAC,CAAA,CAED,IAAM2B,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CACrC,UAAA,CACAyB,CACF,CAAA,CAEA,GAAIzB,CAAAA,CAAS,MAAA,GAAW,UAAA,EAAcA,CAAAA,CAAS,eAAA,CAC7C,MAAM1C,CAAAA,CAAa,mBAAA,CACjB0C,CAAAA,CAAS,eAAA,CAAgB,aAAA,CACzBA,CAAAA,CAAS,eAAA,CAAgB,gBAC3B,CAAA,CAGF,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAUA,CAAAA,CAAS,QAAQ,CAAA,SAAA,EAAYA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAElE,CACL,QAAA,CAAUA,CAAAA,CAAS,QAAA,CACnB,SAAA,CAAW3B,CAAAA,CAAU,SAAA,CACrB,MAAA,CAAQ2B,CAAAA,CAAS,MAAA,CACjB,MAAA,CAAQ3B,CAAAA,CAAU,MAAA,CAClB,OAAA,CAAS2B,CAAAA,CAAS,OAAA,EAAW,IAAI,IAAA,EAAK,CAAE,WAAA,EAC1C,CACF,CAKA,MAAM,kBAAA,CAAmB0B,CAAAA,CAAuD,CAC9E,GAAI,CAAC3D,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK,CAAE,SAAA,CAAU2D,CAAS,CAAA,CAAE,OAAA,CAC1C,MAAMpE,CAAAA,CAAa,UAAA,CAAW,2BAA2B,CAAA,CAG3D,IAAM0C,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CACrC,CAAA,aAAA,EAAgB0B,CAAS,CAAA,CAC3B,CAAA,CAEA,GAAI1B,CAAAA,CAAS,MAAA,GAAW,WAAA,EAAe,CAACA,CAAAA,CAAS,IAAA,CAC/C,MAAM1C,CAAAA,CAAa,QAAA,CAAS,CAAA,QAAA,EAAWoE,CAAS,CAAA,UAAA,CAAY,CAAA,CAG9D,IAAMxB,CAAAA,CAAOF,CAAAA,CAAS,IAAA,CACtB,OAAO,CACL,SAAA,CAAWE,CAAAA,CAAK,SAAA,CAChB,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,QAAA,CAAUA,CAAAA,CAAK,QAAA,CACf,OAAA,CAASA,CAAAA,CAAK,OAAA,CACd,KAAA,CAAOA,CAAAA,CAAK,KAAA,CACZ,OAAA,CAASA,CAAAA,CAAK,OAAA,CACd,eAAA,CAAiBA,CAAAA,CAAK,eAAA,CACtB,iBAAA,CAAmBA,CAAAA,CAAK,iBAAA,CACxB,qBAAA,CAAuBA,CAAAA,CAAK,qBAAA,CAC5B,aAAA,CAAeA,CAAAA,CAAK,aAAA,CACpB,QAAA,CAAUA,CAAAA,CAAK,QACjB,CACF,CAKA,MAAM,iBAAA,CAAkByB,CAAAA,CAAsD,CAC5E,GAAI,CAAC5D,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK,CAAE,SAAA,CAAU4D,CAAQ,CAAA,CAAE,OAAA,CACzC,MAAMrE,CAAAA,CAAa,UAAA,CAAW,0BAA0B,CAAA,CAG1D,IAAM0C,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CACrC,CAAA,YAAA,EAAe2B,CAAQ,CAAA,CACzB,CAAA,CAEA,GAAI3B,CAAAA,CAAS,MAAA,GAAW,WAAA,EAAe,CAACA,CAAAA,CAAS,IAAA,CAC/C,MAAM1C,CAAAA,CAAa,QAAA,CAAS,CAAA,OAAA,EAAUqE,CAAQ,CAAA,UAAA,CAAY,CAAA,CAG5D,IAAMzB,CAAAA,CAAOF,CAAAA,CAAS,IAAA,CACtB,OAAO,CACL,QAAA,CAAUE,CAAAA,CAAK,QAAA,CACf,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,QAAA,CAAUA,CAAAA,CAAK,QAAA,CACf,OAAA,CAASA,CAAAA,CAAK,OAAA,CACd,SAAA,CAAWA,CAAAA,CAAK,SAAA,CAChB,OAAA,CAASA,CAAAA,CAAK,OAAA,CACd,eAAA,CAAiBA,CAAAA,CAAK,eAAA,CACtB,iBAAA,CAAmBA,CAAAA,CAAK,iBAAA,CACxB,qBAAA,CAAuBA,CAAAA,CAAK,qBAAA,CAC5B,aAAA,CAAeA,CAAAA,CAAK,aAAA,CACpB,QAAA,CAAUA,CAAAA,CAAK,QACjB,CACF,CAKA,MAAM,WAAA,CAAY0B,CAAAA,CAA2D,CAE3E,GAAI,CACF,OAAO,MAAM,IAAA,CAAK,kBAAA,CAAmBA,CAAa,CACpD,CAAA,MAASC,CAAAA,CAAK,CAEZ,GAAIA,CAAAA,YAAevE,CAAAA,EAAgBuE,CAAAA,CAAI,IAAA,GAAS,WAAA,CAC9C,OAAO,MAAM,IAAA,CAAK,iBAAA,CAAkBD,CAAa,CAAA,CAEnD,MAAMC,CACR,CACF,CAKA,MAAM,iBAAA,CACJD,CAAAA,CACAjE,CAAAA,CAAuB,EAAC,CACY,CACpC,GAAM,CACJ,QAAA,CAAAmE,CAAAA,CAAW,GAAA,CACX,WAAA,CAAAC,CAAAA,CAAc,EAAA,CACd,cAAA,CAAAC,CACF,CAAA,CAAIrE,CAAAA,CAEAsE,CAAAA,CAEJ,IAAA,IAAS/C,CAAAA,CAAU,CAAA,CAAGA,CAAAA,EAAW6C,CAAAA,CAAa7C,CAAAA,EAAAA,CAAW,CACvD,IAAMe,CAAAA,CAAS,MAAM,IAAA,CAAK,WAAA,CAAY2B,CAAa,CAAA,CAOnD,GALI3B,CAAAA,CAAO,MAAA,GAAWgC,CAAAA,GACpBA,CAAAA,CAAahC,CAAAA,CAAO,MAAA,CACpB+B,CAAAA,GAAiB/B,CAAAA,CAAO,MAAM,CAAA,CAAA,CAG5BA,CAAAA,CAAO,MAAA,GAAW,WAAA,EAAeA,CAAAA,CAAO,MAAA,GAAW,QAAA,CACrD,OAAOA,CAAAA,CAGLf,CAAAA,CAAU6C,CAAAA,EACZ,MAAMjD,EAAAA,CAAMgD,CAAQ,EAExB,CAGA,OADoB,MAAM,IAAA,CAAK,WAAA,CAAYF,CAAa,CAE1D,CAKA,MAAM,YAAA,CAAaM,CAAAA,CAA0D,CAC3E,IAAMC,CAAAA,CAAiC,EAAC,CAExC,OAAID,CAAAA,EAAS,IAAA,GAAMC,CAAAA,CAAO,IAAA,CAAOD,CAAAA,CAAQ,IAAA,CAAA,CACrCA,CAAAA,EAAS,EAAA,GAAIC,CAAAA,CAAO,EAAA,CAAKD,CAAAA,CAAQ,EAAA,CAAA,CACjCA,CAAAA,EAAS,MAAA,GAAQC,CAAAA,CAAO,MAAA,CAASD,CAAAA,CAAQ,MAAA,CAAA,CACzCA,CAAAA,EAAS,QAAA,GAAUC,CAAAA,CAAO,QAAA,CAAWD,CAAAA,CAAQ,QAAA,CAAA,CAC7CA,CAAAA,EAAS,KAAA,GAAOC,CAAAA,CAAO,KAAA,CAAQ,MAAA,CAAOD,CAAAA,CAAQ,KAAK,CAAA,CAAA,CACnDA,CAAAA,EAAS,MAAA,GAAQC,CAAAA,CAAO,MAAA,CAAS,MAAA,CAAOD,CAAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,CAEzC,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAA2B,cAAA,CAAgB,CAChF,MAAA,CAAAC,CACF,CAAC,CAAA,EAEe,GAAA,CAAKC,CAAAA,GAA8B,CACjD,SAAA,CAAWA,CAAAA,CAAQ,SAAA,EAAa,EAAA,CAChC,MAAA,CAAQA,CAAAA,CAAQ,MAAA,CAChB,OAAA,CAASA,CAAAA,CAAQ,OACnB,CAAA,CAAE,CACJ,CAKA,MAAM,WAAA,CAAYF,CAAAA,CAAyD,CACzE,IAAMC,CAAAA,CAAiC,EAAC,CAExC,OAAID,CAAAA,EAAS,IAAA,GAAMC,CAAAA,CAAO,IAAA,CAAOD,CAAAA,CAAQ,IAAA,CAAA,CACrCA,CAAAA,EAAS,EAAA,GAAIC,CAAAA,CAAO,EAAA,CAAKD,CAAAA,CAAQ,EAAA,CAAA,CACjCA,CAAAA,EAAS,MAAA,GAAQC,CAAAA,CAAO,MAAA,CAASD,CAAAA,CAAQ,MAAA,CAAA,CACzCA,CAAAA,EAAS,QAAA,GAAUC,CAAAA,CAAO,QAAA,CAAWD,CAAAA,CAAQ,QAAA,CAAA,CAC7CA,CAAAA,EAAS,KAAA,GAAOC,CAAAA,CAAO,KAAA,CAAQ,MAAA,CAAOD,CAAAA,CAAQ,KAAK,CAAA,CAAA,CACnDA,CAAAA,EAAS,MAAA,GAAQC,CAAAA,CAAO,MAAA,CAAS,MAAA,CAAOD,CAAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,CAEzC,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAA2B,aAAA,CAAe,CAC/E,MAAA,CAAAC,CACF,CAAC,CAAA,EAEe,GAAA,CAAKE,CAAAA,GAA4B,CAC/C,QAAA,CAAUA,CAAAA,CAAO,QAAA,EAAY,EAAA,CAC7B,MAAA,CAAQA,CAAAA,CAAO,MAAA,CACf,OAAA,CAASA,CAAAA,CAAO,OAClB,CAAA,CAAE,CACJ,CAMA,MAAM,qBAAA,CAAsBX,CAAAA,CAA4C,CACtE,GAAI,CAAC3D,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK,CAAE,SAAA,CAAU2D,CAAS,CAAA,CAAE,OAAA,CAC1C,MAAMpE,CAAAA,CAAa,UAAA,CAAW,2BAA2B,CAAA,CAG3D,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,+BAAA,EAAkCoE,CAAS,CAAA,CAAE,CAAA,CAE9D,IAAM1B,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CACrC,CAAA,aAAA,EAAgB0B,CAAS,CAAA,gBAAA,CAAA,CACzB,EACF,CAAA,CAEA,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,4BAAA,EAA+BA,CAAS,CAAA,EAAA,EAAK1B,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAExEA,CACT,CAMA,MAAM,oBAAA,CAAqB2B,CAAAA,CAA2C,CACpE,GAAI,CAAC5D,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK,CAAE,SAAA,CAAU4D,CAAQ,CAAA,CAAE,OAAA,CACzC,MAAMrE,CAAAA,CAAa,UAAA,CAAW,0BAA0B,CAAA,CAG1D,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,8BAAA,EAAiCqE,CAAQ,CAAA,CAAE,CAAA,CAE5D,IAAM3B,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CACrC,CAAA,YAAA,EAAe2B,CAAQ,CAAA,gBAAA,CAAA,CACvB,EACF,CAAA,CAEA,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,2BAAA,EAA8BA,CAAQ,CAAA,EAAA,EAAK3B,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAEtEA,CACT,CAMA,MAAM,oBAAA,CAAqB2B,CAAAA,CAA2C,CACpE,GAAI,CAAC5D,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK,CAAE,SAAA,CAAU4D,CAAQ,CAAA,CAAE,OAAA,CACzC,MAAMrE,CAAAA,CAAa,UAAA,CAAW,0BAA0B,CAAA,CAG1D,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,2BAAA,EAA8BqE,CAAQ,CAAA,CAAE,CAAA,CAEzD,IAAM3B,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CACrC,CAAA,YAAA,EAAe2B,CAAQ,CAAA,OAAA,CAAA,CACvB,EACF,CAAA,CAEA,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiBA,CAAQ,CAAA,EAAA,EAAK3B,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAEzDA,CACT,CACF,CAAA,CC1lBA,IAAMsC,EAAAA,CAAsBvE,KAAAA,CAAE,MAAA,CAAO,CACnC,IAAA,CAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAC/B,WAAA,CAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS,CAC1C,KAAA,CAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CAC3B,QAAA,CAAUA,KAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,CAAO,KAAA,CAAO,KAAK,CAAC,CAAA,CACtC,QAAA,CAAUA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAClC,CAAC,CAAA,CAEKwE,EAAAA,CAAkBxE,KAAAA,CAAE,MAAA,CAAO,CAC/B,SAAA,CAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK,CAC3B,MAAA,CAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,2DAA2D,CACtF,CAAC,CAAA,CAMYyE,CAAAA,CAAN,KAAqB,CAG1B,WAAA,CAA6BjD,CAAAA,CAAgB,CAAhB,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAF7B,IAAA,CAAQ,QAAA,CAAuC,IAAI,IAEL,CAE9C,MAAM,MAAA,CAAOiC,CAAAA,CAAiD,CAC5D,IAAMnD,CAAAA,CAAYiE,EAAAA,CAAoB,KAAA,CAAMd,CAAO,CAAA,CAE7CiB,CAAAA,CAAK,MAAA,CAAO,UAAA,EAAW,CACvBC,CAAAA,CAAM,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CAE7BC,CAAAA,CAAyB,CAC7B,EAAA,CAAAF,CAAAA,CACA,IAAA,CAAMpE,CAAAA,CAAU,IAAA,CAChB,WAAA,CAAaA,CAAAA,CAAU,WAAA,CACvB,KAAA,CAAOA,CAAAA,CAAU,KAAA,CACjB,QAAA,CAAUA,CAAAA,CAAU,QAAA,CACpB,OAAA,CAAS,EAAC,CACV,OAAA,CAASqE,CAAAA,CACT,OAAA,CAASA,CAAAA,CACT,QAAA,CAAUrE,CAAAA,CAAU,QACtB,CAAA,CAEA,OAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIoE,CAAAA,CAAIE,CAAO,CAAA,CAE7B,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,gBAAA,EAAmBF,CAAE,CAAA,CAAA,CAAI,CAAE,IAAA,CAAMpE,CAAAA,CAAU,IAAK,CAAC,CAAA,CAE3D,IAAA,CAAK,SAAA,CAAUsE,CAAO,CAC/B,CAEA,MAAM,GAAA,CAAIC,CAAAA,CAAqC,CAC7C,IAAMD,CAAAA,CAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIC,CAAS,CAAA,CAE3C,GAAI,CAACD,CAAAA,CACH,MAAMrF,CAAAA,CAAa,QAAA,CAAS,CAAA,QAAA,EAAWsF,CAAS,CAAA,UAAA,CAAY,CAAA,CAG9D,OAAO,IAAA,CAAK,SAAA,CAAUD,CAAO,CAC/B,CAEA,MAAM,IAAA,EAA2B,CAC/B,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAKE,CAAAA,EAAM,IAAA,CAAK,SAAA,CAAUA,CAAC,CAAC,CACxE,CAEA,MAAM,MAAA,CACJD,CAAAA,CACAE,CAAAA,CACkB,CAClB,IAAMH,CAAAA,CAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIC,CAAS,CAAA,CAE3C,GAAI,CAACD,CAAAA,CACH,MAAMrF,CAAAA,CAAa,QAAA,CAAS,CAAA,QAAA,EAAWsF,CAAS,CAAA,UAAA,CAAY,CAAA,CAG9D,IAAMvE,CAAAA,CAAYiE,EAAAA,CAAoB,OAAA,EAAQ,CAAE,KAAA,CAAMQ,CAAO,CAAA,CAEvDC,CAAAA,CAAgC,CACpC,GAAGJ,CAAAA,CACH,GAAGtE,CAAAA,CACH,OAAA,CAAS,IAAI,IAAA,EAAK,CAAE,WAAA,EACtB,CAAA,CAEA,OAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIuE,CAAAA,CAAWG,CAAc,CAAA,CAE3C,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,gBAAA,EAAmBH,CAAS,CAAA,CAAE,CAAA,CAExC,IAAA,CAAK,SAAA,CAAUG,CAAc,CACtC,CAEA,MAAM,MAAA,CAAOH,CAAAA,CAAkC,CAG7C,GAAI,CAFY,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIA,CAAS,CAAA,CAGzC,MAAMtF,CAAAA,CAAa,QAAA,CAAS,CAAA,QAAA,EAAWsF,CAAS,CAAA,UAAA,CAAY,CAAA,CAG9D,IAAA,CAAK,QAAA,CAAS,MAAA,CAAOA,CAAS,CAAA,CAE9B,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,gBAAA,EAAmBA,CAAS,CAAA,CAAE,EACjD,CAEA,MAAM,SAAA,CAAUpB,CAAAA,CAA6C,CAC3D,IAAMnD,CAAAA,CAAYkE,EAAAA,CAAgB,KAAA,CAAMf,CAAO,CAAA,CAEzCmB,CAAAA,CAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAItE,CAAAA,CAAU,SAAS,CAAA,CAErD,GAAI,CAACsE,CAAAA,CACH,MAAMrF,CAAAA,CAAa,QAAA,CAAS,CAAA,QAAA,EAAWe,CAAAA,CAAU,SAAS,CAAA,UAAA,CAAY,CAAA,CAGxE,GAAIsE,CAAAA,CAAQ,OAAA,CAAQ,QAAA,CAAStE,CAAAA,CAAU,MAAM,CAAA,CAC3C,MAAMf,CAAAA,CAAa,UAAA,CAAW,CAAA,OAAA,EAAUe,CAAAA,CAAU,MAAM,CAAA,yBAAA,CAA2B,CAAA,CAGrF,OAAAsE,CAAAA,CAAQ,OAAA,CAAQ,IAAA,CAAKtE,CAAAA,CAAU,MAAM,CAAA,CACrCsE,CAAAA,CAAQ,OAAA,CAAU,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CAEzC,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,aAAA,EAAgBtE,CAAAA,CAAU,MAAM,CAAA,YAAA,EAAeA,CAAAA,CAAU,SAAS,CAAA,CAAE,CAAA,CAE9E,IAAA,CAAK,SAAA,CAAUsE,CAAO,CAC/B,CAEA,MAAM,YAAA,CAAaC,CAAAA,CAAmBI,CAAAA,CAAkC,CACtE,IAAML,CAAAA,CAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIC,CAAS,CAAA,CAE3C,GAAI,CAACD,CAAAA,CACH,MAAMrF,CAAAA,CAAa,QAAA,CAAS,CAAA,QAAA,EAAWsF,CAAS,CAAA,UAAA,CAAY,CAAA,CAG9D,IAAMK,CAAAA,CAAcN,CAAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQK,CAAM,CAAA,CAElD,GAAIC,CAAAA,GAAgB,EAAA,CAClB,MAAM3F,CAAAA,CAAa,QAAA,CAAS,CAAA,OAAA,EAAU0F,CAAM,CAAA,qBAAA,CAAuB,CAAA,CAGrE,OAAAL,CAAAA,CAAQ,OAAA,CAAQ,MAAA,CAAOM,CAAAA,CAAa,CAAC,CAAA,CACrCN,CAAAA,CAAQ,OAAA,CAAU,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CAEzC,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,eAAA,EAAkBK,CAAM,CAAA,cAAA,EAAiBJ,CAAS,CAAA,CAAE,CAAA,CAE9D,IAAA,CAAK,SAAA,CAAUD,CAAO,CAC/B,CAEQ,SAAA,CAAUO,CAAAA,CAAgC,CAChD,OAAO,CACL,EAAA,CAAIA,CAAAA,CAAO,EAAA,CACX,IAAA,CAAMA,CAAAA,CAAO,IAAA,CACb,WAAA,CAAaA,CAAAA,CAAO,WAAA,CACpB,KAAA,CAAOA,CAAAA,CAAO,KAAA,CACd,QAAA,CAAUA,CAAAA,CAAO,QAAA,CACjB,OAAA,CAAS,CAAC,GAAGA,CAAAA,CAAO,OAAO,CAAA,CAC3B,OAAA,CAASA,CAAAA,CAAO,OAAA,CAChB,OAAA,CAASA,CAAAA,CAAO,OAClB,CACF,CACF,CAAA,CCvJO,IAAMC,EAAAA,CAAN,KAAqB,CAG1B,WAAA,CACmB5B,CAAAA,CACAhC,CAAAA,CACjBtB,CAAAA,CACA,CAHiB,IAAA,CAAA,UAAA,CAAAsD,CAAAA,CACA,IAAA,CAAA,MAAA,CAAAhC,CAAAA,CAGjB,IAAA,CAAK,aAAA,CAAgBtB,CAAAA,EAAQ,cAC/B,CAEA,gBAAA,CAAiBmF,CAAAA,CAAsB,CACrC,IAAA,CAAK,aAAA,CAAgBA,EACvB,CAEA,eAAA,CAAgBC,CAAAA,CAAiBC,CAAAA,CAA4B,CAC3D,GAAI,CAAC,IAAA,CAAK,aAAA,CACR,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,gEAAgE,CAAA,CAC1E,IAAA,CAGT,GAAI,CAACA,CAAAA,CACH,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,0CAA0C,CAAA,CACpD,KAAA,CAGT,GAAI,CACF,IAAMC,CAAAA,CAAoBC,mBAAAA,CAAW,QAAA,CAAU,IAAA,CAAK,aAAa,CAAA,CAC9D,MAAA,CAAOH,CAAAA,CAAS,MAAM,CAAA,CACtB,MAAA,CAAO,KAAK,CAAA,CAETI,CAAAA,CAAkB,MAAA,CAAO,IAAA,CAAKH,CAAAA,CAAW,KAAK,CAAA,CAC9CI,CAAAA,CAAiB,MAAA,CAAO,IAAA,CAAKH,CAAAA,CAAmB,KAAK,CAAA,CAE3D,OAAIE,CAAAA,CAAgB,MAAA,GAAWC,CAAAA,CAAe,MAAA,CACrC,CAAA,CAAA,CAGFC,wBAAAA,CAAgBF,CAAAA,CAAiBC,CAAc,CACxD,CAAA,MAAShE,CAAAA,CAAO,CACd,OAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mCAAA,CAAqCA,CAAK,CAAA,CACrD,KACT,CACF,CAEA,UAAA,CAAwB2D,CAAAA,CAAyC,CAC/D,GAAI,CACF,IAAMO,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAMP,CAAO,CAAA,CAEhC,GAAI,CAACO,CAAAA,CAAM,OAAA,EAAW,CAACA,CAAAA,CAAM,SAAA,EAAa,CAACA,CAAAA,CAAM,SAAA,CAC/C,MAAM,IAAI,KAAA,CAAM,iCAAiC,CAAA,CAGnD,OAAOA,CACT,CAAA,MAASlE,CAAAA,CAAO,CACd,MAAMpC,CAAAA,CAAa,UAAA,CACjB,CAAA,+BAAA,EAAkCoC,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,eAAe,CAAA,CAC5F,CACF,CACF,CAEA,cAAA,CACE2D,CAAAA,CACAC,CAAAA,CACwB,CACxB,GAAI,CAAC,IAAA,CAAK,eAAA,CAAgBD,CAAAA,CAASC,CAAS,CAAA,CAC1C,MAAMhG,CAAAA,CAAa,YAAA,CAAa,2BAA2B,CAAA,CAG7D,OAAO,IAAA,CAAK,UAAA,CAAc+F,CAAO,CACnC,CAEA,MAAM,gBAAA,CAAiBjD,CAAAA,CAA4B,CACjD,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,0BAAA,EAA6BA,CAAG,CAAA,CAAE,CAAA,CAEnD,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,WAAA,CAAa,CAAE,GAAA,CAAAA,CAAI,CAAC,CAAA,CAE/C,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,sCAAsC,EACzD,CAEA,MAAM,kBAAA,EAAoC,CACxC,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,4BAA4B,CAAA,CAE7C,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,WAAW,CAAA,CAExC,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,wCAAwC,EAC3D,CAEA,cAAA,CAAeyD,CAAAA,CAAsC,CACnD,OAAOA,CAAAA,CAAU,UAAA,CAAW,UAAU,CACxC,CAEA,aAAA,CAAcA,CAAAA,CAAsC,CAClD,OAAOA,CAAAA,CAAU,UAAA,CAAW,SAAS,CACvC,CAEA,aAAA,CAAcA,CAAAA,CAAsC,CAClD,OAAOA,CAAAA,CAAU,UAAA,CAAW,SAAS,CACvC,CAEA,cAAA,CAAeA,CAAAA,CAAsC,CACnD,OAAOA,CAAAA,CAAU,QAAA,CAAS,YAAY,CACxC,CAEA,cAAA,CAAeA,CAAAA,CAAsC,CACnD,OAAOA,CAAAA,CAAU,QAAA,CAAS,SAAS,CACrC,CACF,CAAA,CC1FO,IAAMC,EAAAA,CAAN,KAAkB,CACvB,WAAA,CACmBvC,CAAAA,CACAhC,CAAAA,CACjB,CAFiB,IAAA,CAAA,UAAA,CAAAgC,CAAAA,CACA,IAAA,CAAA,MAAA,CAAAhC,EAChB,CAEH,qBAAA,EAAgC,CAC9B,OAAOwE,OAAAA,EACT,CAEA,qBAAA,CAAsBtB,CAAAA,CAAqB,CACzC,OAAOuB,aAAAA,CAAavB,CAAE,CAAA,EAAKwB,YAAAA,CAAYxB,CAAE,CAAA,GAAM,CACjD,CAMA,MAAM,sBAAA,CAAuB9E,CAAAA,CAGK,CAChC,IAAMwE,CAAAA,CAAiC,EAAC,CACpCxE,CAAAA,EAAS,OAAA,GAASwE,CAAAA,CAAO,OAAA,CAAUxE,CAAAA,CAAQ,OAAA,CAAA,CAC3CA,CAAAA,EAAS,aAAA,GAAewE,CAAAA,CAAO,aAAA,CAAgBxE,CAAAA,CAAQ,aAAA,CAAA,CAE3D,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,+BAAA,CAAiCA,CAAO,CAAA,CAEzD,IAAMqC,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAA0B,iBAAA,CAAmB,CAClF,MAAA,CAAQ,MAAA,CAAO,IAAA,CAAKmC,CAAM,CAAA,CAAE,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAS,MACpD,CAAC,CAAA,CAED,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,4BAAA,EAA+BnC,CAAAA,CAAS,SAAA,CAAU,MAAM,CAAA,UAAA,CAAY,CAAA,CAE9EA,CACT,CAMA,MAAM,uBAAA,CAAwBrC,CAAAA,CAGK,CACjC,IAAMwE,CAAAA,CAAiC,EAAC,CACxC,OAAIxE,CAAAA,EAAS,OAAA,GAASwE,CAAAA,CAAO,OAAA,CAAUxE,CAAAA,CAAQ,OAAA,CAAA,CAC3CA,CAAAA,EAAS,aAAA,GAAewE,CAAAA,CAAO,aAAA,CAAgBxE,CAAAA,CAAQ,aAAA,CAAA,CAE3D,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,gCAAA,CAAkCA,CAAO,CAAA,CAEzC,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAA2B,kBAAA,CAAoB,CACpF,MAAA,CAAQ,MAAA,CAAO,IAAA,CAAKwE,CAAM,CAAA,CAAE,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAS,MACpD,CAAC,CAGH,CAMA,MAAM,eAAA,CAAgB+B,CAAAA,CAAuD,CAC3E,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,sCAAsC,CAAA,CAEvD,IAAMlE,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CACrC,sBAAA,CACA,CAAE,WAAA,CAAAkE,CAAY,CAChB,CAAA,CAEA,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,oBAAA,EAAuBlE,CAAAA,CAAS,QAAQ,CAAA,EAAA,EAAKA,CAAAA,CAAS,OAAO,CAAA,CAAA,CAAG,CAAA,CAE1EA,CACT,CAKA,MAAM,aAAA,EAA8C,CAClD,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,sBAAsB,CAAA,CAEvC,IAAMA,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAAyB,qBAAqB,CAAA,CAErF,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,UAAA,EAAaA,CAAAA,CAAS,MAAM,CAAA,YAAA,CAAc,CAAA,CAEpDA,CACT,CAEA,MAAM,oBAAA,CAAqBmE,CAAAA,CAA0D,CACnF,GAAI,CACF,IAAMlG,CAAAA,CAAS,MAAM,IAAA,CAAK,sBAAA,EAAuB,CAEjD,IAAA,IAAWmG,CAAAA,IAAWnG,CAAAA,CAAO,SAAA,CAC3B,IAAA,IAAWoG,CAAAA,IAAYD,CAAAA,CAAQ,SAAA,CAC7B,GAAIC,CAAAA,CAAS,QAAA,GAAaF,CAAAA,CAAe,CACvC,IAAMG,CAAAA,CAAWD,CAAAA,CAAS,UAAA,CAAW,CAAC,CAAA,CACtC,GAAIC,CAAAA,EAAU,cAAA,CAAgB,CAC5B,IAAMlC,CAAAA,CAAUkC,CAAAA,CAAS,cAAA,CAAe,OAAA,CAClCjC,CAAAA,CAASiC,CAAAA,CAAS,cAAA,CAAe,MAAA,CACjCC,CAAAA,CAAWtD,CAAAA,CAAekD,CAAa,CAAA,CAE7C,OAAO,CACL,UAAA,CAAY/B,CAAAA,EAAS,SAAA,CAAY,UAAA,CAAWA,CAAAA,CAAQ,SAAS,CAAA,CAAImC,CAAAA,CAAS,UAAA,CAC1E,UAAA,CAAYnC,CAAAA,EAAS,SAAA,CAAY,UAAA,CAAWA,CAAAA,CAAQ,SAAS,CAAA,CAAImC,CAAAA,CAAS,UAAA,CAC1E,SAAA,CAAWlC,CAAAA,EAAQ,SAAA,CAAY,UAAA,CAAWA,CAAAA,CAAO,SAAS,CAAA,CAAIkC,CAAAA,CAAS,SAAA,CACvE,SAAA,CAAWlC,CAAAA,EAAQ,SAAA,CAAY,UAAA,CAAWA,CAAAA,CAAO,SAAS,CAAA,CAAIkC,CAAAA,CAAS,SAAA,CACvE,QAAA,CAAUD,CAAAA,CAAS,QAAA,CACnB,UAAA,CAAYC,CAAAA,CAAS,UACvB,CACF,CACF,CAGN,CAAA,MAAS7E,CAAAA,CAAO,CACd,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,gCAAA,EAAmCyE,CAAa,CAAA,gBAAA,CAAA,CAAoBzE,CAAK,EAC5F,CAEA,OAAOuB,CAAAA,CAAekD,CAAa,CACrC,CAEA,MAAM,oBAAA,CAAqBA,CAAAA,CAAwD,CACjF,GAAI,CACF,IAAMK,CAAAA,CAAe,MAAM,IAAA,CAAK,uBAAA,EAAwB,CAExD,IAAA,IAAWJ,CAAAA,IAAWI,CAAAA,CAAc,CAClC,IAAMH,CAAAA,CAAWD,CAAAA,CAAQ,SAAA,CAAU,IAAA,CAAMvB,CAAAA,EAAMA,CAAAA,CAAE,QAAA,GAAasB,CAAa,CAAA,CAC3E,GAAIE,CAAAA,CAAU,CACZ,IAAMI,CAAAA,CAAgBJ,CAAAA,CAAS,cAAA,CAAe,IAAA,CAAMK,CAAAA,EAAOA,CAAAA,CAAG,aAAA,GAAkB,SAAS,CAAA,CACnFC,CAAAA,CAAeN,CAAAA,CAAS,cAAA,CAAe,IAAA,CAAMK,CAAAA,EAAOA,CAAAA,CAAG,aAAA,GAAkB,QAAQ,CAAA,CAEjFE,CAAAA,CACJH,CAAAA,EAAe,MAAA,GAAW,aAAA,EAC1BE,CAAAA,EAAc,MAAA,GAAW,aAAA,CACrBE,CAAAA,CACJJ,CAAAA,EAAe,MAAA,GAAW,SAAA,EAC1BE,CAAAA,EAAc,MAAA,GAAW,SAAA,CACrBG,CAAAA,CACJL,CAAAA,EAAe,MAAA,GAAW,QAAA,EAC1BE,CAAAA,EAAc,MAAA,GAAW,QAAA,CAE3B,OAAO,CACL,aAAA,CAAAR,CAAAA,CACA,SAAA,CAAWS,CAAAA,EAAiBC,CAAAA,CAC5B,QAAA,CAAUA,CAAAA,CACV,OAAA,CAASC,CAAAA,CAAW,8BAAA,CAAiC,KAAA,CACvD,CACF,CACF,CAEA,OAAO,CACL,aAAA,CAAAX,CAAAA,CACA,SAAA,CAAW,CAAA,CAAA,CACX,QAAA,CAAU,CAAA,CAAA,CACV,OAAA,CAAS,8CACX,CACF,CAAA,MAASzE,CAAAA,CAAO,CACd,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,qCAAA,EAAwCyE,CAAa,CAAA,CAAA,CAAIzE,CAAK,CAAA,CAExE,CACL,aAAA,CAAAyE,CAAAA,CACA,SAAA,CAAW,KAAA,CACX,QAAA,CAAU,IAAA,CACV,OAAA,CAAS,+BACX,CACF,CACF,CAEA,iBAAA,CAAkBY,CAAAA,CAAeC,CAAAA,CAA6B,CAC5D,IAAIC,CAAAA,CAAUF,CAAAA,CAAM,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAEjCE,CAAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,GACzBA,CAAAA,CAAUA,CAAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAA,CAkB3B,IAAM1E,CAAAA,CAf0C,CAC9C,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KACP,CAAA,CAE+ByE,CAAAA,CAAY,WAAA,EAAa,CAAA,CAExD,OAAIzE,CAAAA,EAAU,CAAC0E,CAAAA,CAAQ,UAAA,CAAW1E,CAAM,CAAA,GAClC0E,CAAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,GACxBA,CAAAA,CAAUA,CAAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAA,CAE3BA,CAAAA,CAAU1E,CAAAA,CAAS0E,CAAAA,CAAAA,CAGdA,CACT,CAEA,mBAAA,CAAoBF,CAAAA,CAAeZ,CAAAA,CAAuC,CACxE,IAAMe,CAAAA,CAAOlE,CAAAA,CAAmBmD,CAAa,CAAA,CAC7C,GAAI,CAACe,CAAAA,CACH,OAAO,MAAA,CAGT,IAAMD,CAAAA,CAAUF,CAAAA,CAAM,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CACvC,OAAOG,CAAAA,CAAK,UAAA,CAAW,IAAA,CAAKD,CAAO,CACrC,CAEA,0BAAA,EAAuD,CACrD,OAAOlE,CACT,CAEA,oBAAA,CAAqBoD,CAAAA,CAAiD,CACpE,OAAOnD,CAAAA,CAAmBmD,CAAa,CACzC,CAEA,wBAAA,EAAgD,CAC9C,OAAO,MAAA,CAAO,MAAA,CAAOnD,CAAkB,CACzC,CAEA,mBAAA,CAAoB+D,CAAAA,CAAqC,CACvD,IAAME,CAAAA,CAAUF,CAAAA,CAAM,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAEvC,IAAA,GAAW,CAACZ,CAAAA,CAAee,CAAI,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQlE,CAAkB,CAAA,CACnE,GAAIkE,CAAAA,CAAK,UAAA,CAAW,IAAA,CAAKD,CAAO,CAAA,CAC9B,OAAOd,CAAAA,CAIX,OAAO,IACT,CACF,CAAA,CCxPA,IAAMgB,EAAAA,CAAyBpH,KAAAA,CAAE,MAAA,CAAO,CACtC,MAAA,CAAQA,KAAAA,CAAE,MAAA,CAAO,CACf,OAAA,CAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,CAAC,CAAA,CAC5B,QAAA,CAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,CAAC,CAAA,CAC7B,QAAA,CAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EACvB,CAAC,CAAA,CACD,WAAA,CAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAC5B,SAAA,CAAWA,KAAAA,CAAE,MAAA,EAAO,CACpB,OAAA,CAASA,KAAAA,CAAE,MAAA,EAAO,CAClB,UAAA,CAAYA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAC1B,CAAC,CAAA,CAEYqH,EAAAA,CAAN,KAAqB,CAC1B,WAAA,CACmB7D,CAAAA,CACAhC,CAAAA,CACjB,CAFiB,IAAA,CAAA,UAAA,CAAAgC,CAAAA,CACA,IAAA,CAAA,MAAA,CAAAhC,EAChB,CAMH,MAAM,iBAAA,EAA8C,CAClD,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,0BAA0B,CAAA,CAE3C,IAAMS,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CACrC,sBACF,CAAA,CAEA,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,UAAA,EAAaA,CAAAA,CAAS,QAAA,CAAS,MAAM,CAAA,gBAAA,CAAkB,CAAA,CAEjEA,CAAAA,CAAS,QAClB,CAMA,MAAM,iBAAA,CAAkBwB,CAAAA,CAAuD,CAC7E,IAAMnD,CAAAA,CAAY8G,EAAAA,CAAuB,KAAA,CAAM3D,CAAO,CAAA,CAEtD,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,sBAAA,CAAwB,CACvC,MAAA,CAAQnD,CAAAA,CAAU,MAAA,CAClB,SAAA,CAAWA,CAAAA,CAAU,SAAA,CACrB,OAAA,CAASA,CAAAA,CAAU,OACrB,CAAC,CAAA,CAED,IAAM2B,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CACrC,gBAAA,CACA3B,CACF,CAAA,CAEA,GAAI2B,CAAAA,CAAS,MAAA,GAAW,UAAA,EAAcA,CAAAA,CAAS,aAAA,CAC7C,MAAM1C,CAAAA,CAAa,mBAAA,CACjB0C,CAAAA,CAAS,aAAA,CAAc,WAAA,CACvBA,CAAAA,CAAS,aAAA,CAAc,cACzB,CAAA,CAGF,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,UAAA,EAAaA,CAAAA,CAAS,WAAW,CAAA,SAAA,EAAYA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAExEA,CACT,CAKA,MAAM,oBAAA,CAAqBqF,CAAAA,CAA6C,CACtE,GAAI,CAACtH,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK,CAAE,SAAA,CAAUsH,CAAW,CAAA,CAAE,OAAA,CAC5C,MAAM/H,CAAAA,CAAa,UAAA,CAAW,6BAA6B,CAAA,CAG7D,IAAM0C,CAAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CACrC,CAAA,eAAA,EAAkBqF,CAAW,CAAA,CAC/B,CAAA,CAEA,GAAIrF,CAAAA,CAAS,MAAA,GAAW,WAAA,EAAe,CAACA,CAAAA,CAAS,IAAA,CAC/C,MAAM1C,CAAAA,CAAa,QAAA,CAAS,CAAA,UAAA,EAAa+H,CAAW,CAAA,UAAA,CAAY,CAAA,CAGlE,OAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,UAAA,EAAaA,CAAW,CAAA,SAAA,EAAYrF,CAAAA,CAAS,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,CAEpEA,CAAAA,CAAS,IAClB,CAKA,MAAM,0BAAA,CACJqF,CAAAA,CACA1H,CAAAA,CAAuD,EAAC,CAChC,CACxB,GAAM,CAAE,QAAA,CAAAmE,CAAAA,CAAW,GAAA,CAAM,WAAA,CAAAC,CAAAA,CAAc,EAAG,CAAA,CAAIpE,CAAAA,CAE9C,IAAA,IAASuB,CAAAA,CAAU,CAAA,CAAGA,CAAAA,EAAW6C,CAAAA,CAAa7C,CAAAA,EAAAA,CAAW,CACvD,IAAMe,CAAAA,CAAS,MAAM,IAAA,CAAK,oBAAA,CAAqBoF,CAAW,CAAA,CAE1D,GAAIpF,CAAAA,CAAO,MAAA,GAAW,WAAA,EAAeA,CAAAA,CAAO,MAAA,GAAW,QAAA,CACrD,OAAOA,CAAAA,CAGLf,CAAAA,CAAU6C,CAAAA,EACZ,MAAM,IAAI,OAAA,CAAS/C,CAAAA,EAAY,UAAA,CAAWA,CAAAA,CAAS8C,CAAQ,CAAC,EAEhE,CAEA,OAAO,IAAA,CAAK,oBAAA,CAAqBuD,CAAW,CAC9C,CACF,CAAA,CC/GO,IAAMC,EAAAA,CAAN,KAAsB,CAW3B,WAAA,CAAYrH,CAAAA,CAA+B,CAEzC,IAAMsH,CAAAA,CAAsC,CAC1C,GAFgBhH,EAAAA,EAAiB,CAGjC,GAAGN,CACL,CAAA,CAEA,IAAA,CAAK,MAAA,CAASD,EAAAA,CAAcuH,CAAY,CAAA,CACxC,IAAA,CAAK,MAAA,CAAS,IAAIjF,CAAAA,CAAO,iBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAChE,IAAA,CAAK,UAAA,CAAaT,CAAAA,CAAW,UAAA,CAAW,IAAA,CAAK,MAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,CAEhE,IAAA,CAAK,YAAA,CAAe,IAAIyB,CAAAA,CAAmB,IAAA,CAAK,UAAA,CAAY,IAAA,CAAK,MAAM,CAAA,CACvE,IAAA,CAAK,QAAA,CAAW,IAAIkB,CAAAA,CAAe,IAAA,CAAK,MAAM,CAAA,CAC9C,IAAA,CAAK,QAAA,CAAW,IAAIW,EAAAA,CAAe,IAAA,CAAK,UAAA,CAAY,IAAA,CAAK,MAAA,CAAQ,CAC/D,aAAA,CAAe,IAAA,CAAK,uBAAA,EACtB,CAAC,CAAA,CACD,IAAA,CAAK,KAAA,CAAQ,IAAIW,EAAAA,CAAY,IAAA,CAAK,UAAA,CAAY,IAAA,CAAK,MAAM,CAAA,CACzD,IAAA,CAAK,QAAA,CAAW,IAAIsB,EAAAA,CAAe,IAAA,CAAK,UAAA,CAAY,IAAA,CAAK,MAAM,CAAA,CAE/D,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,6BAAA,CAA+B,CAC9C,WAAA,CAAa,IAAA,CAAK,MAAA,CAAO,WAAA,CACzB,OAAA,CAAS,IAAA,CAAK,MAAA,CAAO,OACvB,CAAC,EACH,CAEQ,uBAAA,EAA8C,CACpD,GAAI,OAAO,OAAA,CAAY,GAAA,EAAe,OAAA,CAAQ,GAAA,CAC5C,OAAO,OAAA,CAAQ,GAAA,CAAI,sBAGvB,CAEA,SAAA,EAAsC,CACpC,OAAO,CAAE,GAAG,IAAA,CAAK,MAAO,CAC1B,CAEA,WAAA,CAAYxG,CAAAA,CAAuB,CACjC,IAAA,CAAK,MAAA,CAAO,QAAA,CAASA,CAAK,EAC5B,CAEA,gBAAA,CAAiBwE,CAAAA,CAAsB,CACrC,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiBA,CAAM,EACvC,CACF,EC7CA,IAAMoC,CAAAA,CAAe,IACZ,sCAAA,CAAuC,OAAA,CAAQ,OAAA,CAAUC,CAAAA,EAAM,CACpE,IAAMC,CAAAA,CAAK,IAAA,CAAK,MAAA,EAAO,CAAI,EAAA,CAAM,CAAA,CAEjC,OAAA,CADUD,CAAAA,GAAM,GAAA,CAAMC,CAAAA,CAAKA,CAAAA,CAAI,CAAA,CAAO,CAAA,EAC7B,QAAA,CAAS,EAAE,CACtB,CAAC,CAAA,CAGI,SAASC,EAAAA,CACd9B,CAAAA,CACAlG,CAAAA,CAAmC,EAAC,CACM,CAC1C,GAAM,CACJ,aAAA,CAAAiE,CAAAA,CAAgB4D,CAAAA,EAAa,CAC7B,MAAA,CAAAI,CAAAA,CAAS,MAAA,CACT,QAAA,CAAAtB,CAAAA,CAAW,KAAA,CACX,aAAA,CAAAH,CAAAA,CAAgB,cAAA,CAChB,WAAA,CAAAD,CAAAA,CAAc,cAAA,CACd,MAAA,CAAAjE,CAAAA,CAAS4D,CAAAA,GAAc,gBAAA,CAAmB,QAAA,CAAW,WAAA,CACrD,WAAA,CAAAgC,CAAAA,CAAc,oBAAA,CACd,cAAA,CAAAC,CAAAA,CAAiB,kCACnB,CAAA,CAAInI,CAAAA,CAEE+E,CAAAA,CAAM,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CAE7BxC,CAAAA,CAA4B,CAChC,SAAA,CAAW0B,CAAAA,CACX,MAAA,CAAA3B,CAAAA,CACA,MAAA,CAAA2F,CAAAA,CACA,QAAA,CAAAtB,CAAAA,CACA,aAAA,CAAAH,CAAAA,CACA,KAAA,CAAO,CACL,IAAA,CAAM,QAAA,CACN,OAAA,CAAS,CACP,KAAA,CAAOD,CACT,CACF,CAAA,CACA,iBAAA,CAAmBxB,CAAAA,CACnB,OAAA,CAASA,CACX,CAAA,CAEA,OAAIzC,CAAAA,GAAW,WAAA,GACbC,CAAAA,CAAK,eAAA,CAAkBwC,CAAAA,CAAAA,CAGrBzC,CAAAA,GAAW,QAAA,GACbC,CAAAA,CAAK,aAAA,CAAgB,CACnB,WAAA,CAAA2F,CAAAA,CACA,cAAA,CAAAC,CACF,CAAA,CAAA,CAGK,CACL,OAAA,CAASN,CAAAA,EAAa,CACtB,SAAA,CAAA3B,CAAAA,CACA,SAAA,CAAWnB,CAAAA,CACX,IAAA,CAAAxC,CACF,CACF,CAEO,SAAS6F,EAAAA,CACdlC,CAAAA,CACAlG,CAAAA,CAAmC,EAAC,CACK,CACzC,GAAM,CACJ,aAAA,CAAAiE,CAAAA,CAAgB4D,CAAAA,EAAa,CAC7B,MAAA,CAAAI,CAAAA,CAAS,MAAA,CACT,QAAA,CAAAtB,CAAAA,CAAW,KAAA,CACX,aAAA,CAAAH,CAAAA,CAAgB,cAAA,CAChB,WAAA,CAAAD,CAAAA,CAAc,cAAA,CACd,MAAA,CAAAjE,CAAAA,CAAS4D,CAAAA,GAAc,eAAA,CAAkB,QAAA,CAAW,WAAA,CACpD,WAAA,CAAAgC,CAAAA,CAAc,qBAAA,CACd,cAAA,CAAAC,CAAAA,CAAiB,qCACnB,CAAA,CAAInI,CAAAA,CAEE+E,CAAAA,CAAM,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CAE7BxC,CAAAA,CAA2B,CAC/B,QAAA,CAAU0B,CAAAA,CACV,MAAA,CAAA3B,CAAAA,CACA,MAAA,CAAA2F,CAAAA,CACA,QAAA,CAAAtB,CAAAA,CACA,aAAA,CAAAH,CAAAA,CACA,SAAA,CAAW,CACT,IAAA,CAAM,QAAA,CACN,OAAA,CAAS,CACP,KAAA,CAAOD,CACT,CACF,CAAA,CACA,iBAAA,CAAmBxB,CAAAA,CACnB,OAAA,CAASA,CACX,CAAA,CAEA,OAAIzC,CAAAA,GAAW,WAAA,GACbC,CAAAA,CAAK,mBAAA,CAAsBwC,CAAAA,CAAAA,CAGzBzC,CAAAA,GAAW,QAAA,GACbC,CAAAA,CAAK,aAAA,CAAgB,CACnB,WAAA,CAAA2F,CAAAA,CACA,cAAA,CAAAC,CACF,CAAA,CAAA,CAGK,CACL,OAAA,CAASN,CAAAA,EAAa,CACtB,SAAA,CAAA3B,CAAAA,CACA,SAAA,CAAWnB,CAAAA,CACX,IAAA,CAAAxC,CACF,CACF,CAsBO,SAAS8F,EAAAA,CACdnC,CAAAA,CACAlG,CAAAA,CAA4D,EAAC,CACpB,CACzC,GAAM,CACJ,aAAA,CAAAiE,CAAAA,CAAgB4D,CAAAA,EAAa,CAC7B,SAAA,CAAA9D,CAAAA,CAAY8D,CAAAA,EAAa,CACzB,MAAA,CAAAI,CAAAA,CAAS,MAAA,CACT,QAAA,CAAAtB,CAAAA,CAAW,KAAA,CACX,aAAA,CAAAH,CAAAA,CAAgB,cAAA,CAChB,WAAA,CAAAD,CAAAA,CAAc,cAAA,CACd,MAAA,CAAAjE,CAAAA,CAAS4D,CAAAA,GAAc,eAAA,CAAkB,QAAA,CAAW,WAAA,CACpD,WAAA,CAAAgC,CAAAA,CAAc,uBAAA,CACd,cAAA,CAAAC,CAAAA,CAAiB,oCACnB,CAAA,CAAInI,CAAAA,CAEE+E,CAAAA,CAAM,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CAE7BxC,CAAAA,CAA2B,CAC/B,QAAA,CAAU0B,CAAAA,CACV,SAAA,CAAAF,CAAAA,CACA,MAAA,CAAAzB,CAAAA,CACA,MAAA,CAAA2F,CAAAA,CACA,QAAA,CAAAtB,CAAAA,CACA,aAAA,CAAAH,CAAAA,CACA,SAAA,CAAW,CACT,IAAA,CAAM,QAAA,CACN,OAAA,CAAS,CACP,KAAA,CAAOD,CACT,CACF,CAAA,CACA,OAAA,CAASxB,CACX,CAAA,CAEA,OAAIzC,CAAAA,GAAW,QAAA,GACbC,CAAAA,CAAK,aAAA,CAAgB,CACnB,WAAA,CAAA2F,CAAAA,CACA,cAAA,CAAAC,CACF,CAAA,CAAA,CAGK,CACL,OAAA,CAASN,CAAAA,EAAa,CACtB,SAAA,CAAA3B,CAAAA,CACA,SAAA,CAAWnB,CAAAA,CACX,IAAA,CAAAxC,CACF,CACF,CAOO,SAAS+F,EAAAA,CACdpC,CAAAA,CACAlG,CAAAA,CAA4D,EAAC,CAC3C,CAClB,OAAIkG,CAAAA,CAAU,UAAA,CAAW,UAAU,CAAA,CAC1B8B,EAAAA,CACL9B,CAAAA,CACAlG,CACF,CAAA,CAGEkG,CAAAA,CAAU,UAAA,CAAW,SAAS,CAAA,CACzBkC,EAAAA,CACLlC,CAAAA,CACAlG,CACF,CAAA,CAGKqI,EAAAA,CACLnC,CAAAA,CACAlG,CACF,CACF,CAEO,IAAMuI,EAAAA,CAA0C,CACrD,kBAAA,CACA,mBAAA,CACA,gBAAA,CACA,iBAAA,CACA,kBAAA,CACA,eAAA,CACA,kBAAA,CACA,eACF,CAAA,CCzLA,IAAMC,EAAAA,CAA6BC,CAAAA,GAAmC,CACpE,SAAA,CAAWA,CAAAA,CACX,MAAA,CAAQ,UAAA,CACR,OAAA,CAAS,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CAChC,QAAA,CAAU,cACZ,CAAA,CAAA,CAEMC,EAAAA,CAA4BD,CAAAA,GAAkC,CAClE,QAAA,CAAUA,CAAAA,CACV,MAAA,CAAQ,UAAA,CACR,OAAA,CAAS,IAAI,IAAA,EAAK,CAAE,WAAA,EACtB,CAAA,CAAA,CAEME,EAAAA,CAA4BF,CAAAA,GAAkB,CAClD,SAAA,CAAWA,CAAAA,CACX,MAAA,CAAQ,CAAC,WAAA,CAAa,UAAA,CAAY,YAAA,CAAc,UAAU,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,CAAI,CAAC,CAAC,CAAA,CACzF,OAAA,CAAS,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,CAAI,GAAK,CAAA,CAAE,WAAA,EAAY,CAClD,MAAA,CAAQ,MAAA,CACR,QAAA,CAAU,KAAA,CACV,OAAA,CAAS,KAAA,CACT,KAAA,CAAO,CACL,IAAA,CAAM,KAAA,CACN,cAAA,CAAgB,CACd,WAAA,CAAa,cAAA,CACb,QAAA,CAAU,cACZ,CACF,CACF,CAAA,CAAA,CAEMG,EAAAA,CAAiC,IAAM,CAC3C,CACE,OAAA,CAAS,KAAA,CACT,SAAA,CAAW,CACT,CACE,QAAA,CAAU,cAAA,CACV,cAAA,CAAgB,CACd,CAAE,aAAA,CAAe,SAAA,CAAW,MAAA,CAAQ,aAAc,CAAA,CAClD,CAAE,aAAA,CAAe,QAAA,CAAU,MAAA,CAAQ,aAAc,CACnD,CACF,CAAA,CACA,CACE,QAAA,CAAU,YAAA,CACV,cAAA,CAAgB,CACd,CAAE,aAAA,CAAe,SAAA,CAAW,MAAA,CAAQ,aAAc,CAAA,CAClD,CAAE,aAAA,CAAe,QAAA,CAAU,MAAA,CAAQ,SAAU,CAC/C,CACF,CACF,CACF,CACF,CAAA,CAEMC,EAAAA,CAA6BzB,CAAAA,GAAmB,CACpD,OAAA,CAAS,KAAA,CACT,QAAA,CAAUA,CAAAA,CAAM,UAAA,CAAW,OAAO,CAAA,CAAI,cAAA,CAAiB,YAAA,CACvD,WAAA,CAAaA,CAAAA,CAAM,OAAA,CAAQ,KAAA,CAAO,EAAE,CACtC,CAAA,CAAA,CAEM0B,EAAAA,CAAiC,KAAO,CAC5C,WAAA,CAAa,cAAA,CACb,sBAAA,CAAwB,CACtB,kBAAA,CAAoB,KAAA,CACpB,eAAA,CAAiB,IACnB,CAAA,CACA,SAAA,CAAW,CACT,CACE,OAAA,CAAS,KAAA,CACT,WAAA,CAAa,CAAE,EAAA,CAAI,UAAA,CAAY,EAAA,CAAI,UAAW,CAAA,CAC9C,MAAA,CAAQ,KAAA,CACR,IAAA,CAAM,sCAAA,CACN,SAAA,CAAW,CACT,CACE,QAAA,CAAU,cAAA,CACV,WAAA,CAAa,kBAAA,CACb,uBAAA,CAAyB,UAAA,CACzB,UAAA,CAAY,CACV,CACE,QAAA,CAAU,KAAA,CACV,WAAA,CAAa,WAAA,CACb,cAAA,CAAgB,CACd,OAAA,CAAS,CAAE,SAAA,CAAW,KAAA,CAAO,SAAA,CAAW,SAAA,CAAW,MAAA,CAAQ,aAAc,CAAA,CACzE,MAAA,CAAQ,CAAE,SAAA,CAAW,KAAA,CAAO,SAAA,CAAW,QAAA,CAAU,MAAA,CAAQ,aAAc,CACzE,CACF,CACF,CACF,CACF,CACF,CACF,CACF,CAAA,CAAA,CAEMC,EAAAA,CAAmC,KAAO,CAC9C,QAAA,CAAU,CACR,CAAE,OAAA,CAAS,KAAA,CAAO,QAAA,CAAU,KAAA,CAAO,OAAA,CAAS,YAAa,CAAA,CACzD,CAAE,OAAA,CAAS,KAAA,CAAO,QAAA,CAAU,KAAA,CAAO,OAAA,CAAS,WAAY,CAAA,CACxD,CAAE,OAAA,CAAS,KAAA,CAAO,QAAA,CAAU,KAAA,CAAO,OAAA,CAAS,WAAY,CAC1D,CACF,CAAA,CAAA,CAEMC,EAAAA,CAA+B,IAAM,CACzC,CACE,EAAA,CAAI,SAAA,CACJ,GAAA,CAAK,iDACP,CACF,CAAA,CAEMC,CAAAA,CAAgB,CAAC7H,CAAAA,CAAa,GAAA,GAAQ,IAAI,OAAA,CAAQC,CAAAA,EAAW,UAAA,CAAWA,CAAAA,CAASD,CAAAA,CAAK,IAAA,CAAK,MAAA,EAAO,CAAI,GAAG,CAAC,CAAA,CAGhH,eAAe8H,EAAAA,CAAkBrJ,CAAAA,CAAiB4F,CAAAA,CAAiC,CACjF,IAAM0D,CAAAA,CAAU,IAAI,WAAA,CACdnG,CAAAA,CAAM,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA,CAC9B,KAAA,CACAmG,CAAAA,CAAQ,MAAA,CAAO1D,CAAM,CAAA,CACrB,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAM,SAAU,CAAA,CAChC,KAAA,CACA,CAAC,MAAM,CACT,CAAA,CACME,CAAAA,CAAY,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAQ3C,CAAAA,CAAKmG,CAAAA,CAAQ,MAAA,CAAOtJ,CAAO,CAAC,CAAA,CAC/E,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,UAAA,CAAW8F,CAAS,CAAC,CAAA,CACxC,GAAA,CAAKyD,CAAAA,EAAMA,CAAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CACZ,CAEA,IAAMvB,EAAAA,CAAe,IACZ,sCAAA,CAAuC,OAAA,CAAQ,OAAA,CAAUC,CAAAA,EAAM,CACpE,IAAMC,CAAAA,CAAK,IAAA,CAAK,MAAA,EAAO,CAAI,EAAA,CAAM,CAAA,CAEjC,OAAA,CADUD,CAAAA,GAAM,GAAA,CAAMC,CAAAA,CAAKA,CAAAA,CAAI,CAAA,CAAO,CAAA,EAC7B,QAAA,CAAS,EAAE,CACtB,CAAC,CAAA,CAGGsB,EAAAA,CAAoF,CACxF,CAAE,KAAA,CAAO,cAAA,CAAgB,KAAA,CAAO,kBAAA,CAAoB,OAAA,CAAS,UAAW,CAAA,CACxE,CAAE,KAAA,CAAO,YAAA,CAAc,KAAA,CAAO,cAAA,CAAgB,OAAA,CAAS,UAAW,CAAA,CAClE,CAAE,KAAA,CAAO,cAAA,CAAgB,KAAA,CAAO,kBAAA,CAAoB,OAAA,CAAS,OAAQ,CAAA,CACrE,CAAE,KAAA,CAAO,YAAA,CAAc,KAAA,CAAO,cAAA,CAAgB,OAAA,CAAS,OAAQ,CAAA,CAC/D,CAAE,KAAA,CAAO,cAAA,CAAgB,KAAA,CAAO,kBAAA,CAAoB,OAAA,CAAS,OAAQ,CAAA,CACrE,CAAE,KAAA,CAAO,YAAA,CAAc,KAAA,CAAO,cAAA,CAAgB,OAAA,CAAS,OAAQ,CACjE,CAAA,CAEMC,EAAAA,CAAmB,CACvB,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,sBAAuB,CAAA,CAC9C,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,uBAAwB,CAAA,CAC/C,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,kBAAmB,CAAA,CAC1C,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,uBAAwB,CAAA,CAC/C,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,qBAAsB,CAAA,CAC7C,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,0BAA2B,CAAA,CAClD,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,wBAAyB,CAAA,CAChD,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,sBAAuB,CAChD,CAAA,CAEO,SAASC,EAAAA,CAAqB,CACnC,MAAA,CAAQC,CAAAA,CAAgB,EAAA,CACxB,WAAA,CAAaC,CAAAA,CAAqB,SAAA,CAClC,SAAA,CAAAC,CAAAA,CAAY,EAAA,CACZ,QAAA,CAAUC,CAAAA,CAAkB,KAAA,CAC5B,WAAA,CAAAC,CAAAA,CAAc,cAAA,CACd,iBAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CACF,CAAA,CAA8B,CAC5B,GAAM,CAACC,CAAAA,CAAQC,CAAS,CAAA,CAAIC,cAAAA,CAASV,CAAa,CAAA,CAC5C,CAACW,CAAAA,CAAaC,CAAc,CAAA,CAAIF,cAAAA,CAAmCT,CAAkB,CAAA,CACrF,CAACY,CAAAA,CAAcC,EAAe,CAAA,CAAIJ,cAAAA,CAAS,CAAC,CAACV,CAAAA,EAAiBG,CAAe,CAAA,CAC7E,CAACY,CAAAA,CAAYC,EAAa,CAAA,CAAIN,cAAAA,CAASP,CAAe,CAAA,CAEtD,CAACc,CAAAA,CAAWC,CAAY,CAAA,CAAIR,cAAAA,CAAkB,SAAS,CAAA,CACvD,CAAC3D,CAAAA,CAAaoE,EAAc,CAAA,CAAIT,cAAAA,CAAS,cAAc,CAAA,CACvD,CAACjC,CAAAA,CAAQ2C,EAAS,CAAA,CAAIV,cAAAA,CAAS,MAAM,CAAA,CACrC,CAACvD,CAAAA,CAAUkE,EAAW,CAAA,CAAIX,cAAAA,CAAS,KAAK,CAAA,CACxC,CAACxD,CAAAA,CAAUoE,EAAW,CAAA,CAAIZ,cAAAA,CAAwB,cAAc,CAAA,CAChE,CAACa,EAAAA,CAAaC,EAAc,CAAA,CAAId,cAAAA,CAAS,cAAc,CAAA,CACvD,CAACjG,CAAAA,CAAegH,EAAgB,CAAA,CAAIf,cAAAA,CAAS,EAAE,CAAA,CAE/C,CAACgB,EAAAA,CAASC,EAAU,CAAA,CAAIjB,cAAAA,CAAuB,EAAE,CAAA,CACjD,CAACkB,CAAAA,CAAeC,CAAgB,CAAA,CAAInB,cAAAA,CAA0B,MAAM,CAAA,CAGpE,CAACoB,EAAAA,CAAeC,EAAgB,CAAA,CAAIrB,cAAAA,CAAS,uBAAuB,CAAA,CACpE,CAACsB,EAAAA,CAAeC,EAAgB,CAAA,CAAIvB,cAAAA,CAA6B,EAAE,CAAA,CACnE,CAACwB,CAAAA,CAAkBC,EAAmB,CAAA,CAAIzB,cAAAA,CAA2B,mBAAmB,CAAA,CACxF,CAAC0B,EAAAA,CAAeC,EAAgB,CAAA,CAAI3B,cAAAA,CAAS,MAAM,CAAA,CACnD,CAAC4B,EAAAA,CAAcC,EAAe,CAAA,CAAI7B,cAAAA,CAAS,cAAc,CAAA,CACzD,CAAC8B,EAAAA,CAAiBC,EAAkB,CAAA,CAAI/B,cAAAA,CAAwB,cAAc,CAAA,CAC9E,CAACgC,EAAAA,CAAkBC,EAAmB,CAAA,CAAIjC,cAAAA,CAAiB,EAAE,CAAA,CAC7D,CAACkC,EAAAA,CAAoBC,EAAqB,CAAA,CAAInC,cAAAA,CAAiB,EAAE,CAAA,CACjE,CAACoC,EAAAA,CAAeC,EAAgB,CAAA,CAAIrC,cAAAA,CAAiB,EAAE,CAAA,CACvD,CAACsC,EAAAA,CAAiBC,EAAkB,CAAA,CAAIvC,cAAAA,CAAiB,EAAE,CAAA,CAC3D,CAACwC,EAAAA,CAAcC,EAAe,CAAA,CAAIzC,cAAAA,CAAiB,EAAE,CAAA,CACrD,CAAC0C,CAAAA,CAAcC,EAAe,CAAA,CAAI3C,cAAAA,CAAyB,IAAI,CAAA,CAC/D,CAAC4C,EAAAA,CAAYC,EAAa,CAAA,CAAI7C,cAAAA,CAAiB,EAAE,CAAA,CACjD,CAAC8C,CAAAA,CAAaC,EAAc,CAAA,CAAI/C,cAAAA,CAAyC,IAAI,CAAA,CAC7E,CAACgD,EAAAA,CAAYC,EAAa,CAAA,CAAIjD,cAAAA,CAAiB,EAAE,CAAA,CACjD,CAACkD,CAAAA,CAAgBC,EAAiB,CAAA,CAAInD,cAAAA,CAAkD,KAAK,CAAA,CAE7FoD,CAAAA,CAAYC,iBAAAA,CAAY,CAAC5L,CAAAA,CAAmBW,CAAAA,CAAyBD,CAAAA,CAAoBN,CAAAA,GAAmB,CAChH,IAAMxB,EAAAA,CAAqB,CACzB,EAAA,CAAIsH,EAAAA,EAAa,CACjB,SAAA,CAAAlG,CAAAA,CACA,MAAA,CAAAW,CAAAA,CACA,QAAA,CAAAD,CAAAA,CACA,KAAA,CAAAN,CAAAA,CACA,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,kBAAA,EACxB,CAAA,CACAoJ,EAAAA,CAAYqC,EAAAA,EAAS,CAACjN,EAAAA,CAAQ,GAAGiN,EAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAC,EACrD,CAAA,CAAG,EAAE,CAAA,CAECC,EAAAA,CAAkBF,iBAAAA,CAAY,IAAM,CACxC,GAAI,CAACvD,CAAAA,CAAO,IAAA,EAAK,CAAG,CAClBsD,CAAAA,CAAU,eAAA,CAAiB,OAAA,CAAS,MAAA,CAAW,qBAAqB,CAAA,CACpE,MACF,CACAhD,EAAAA,CAAgB,IAAI,CAAA,CACpBE,EAAAA,CAAc,KAAK,CAAA,CACnB8C,CAAAA,CAAU,eAAA,CAAiB,SAAA,CAAW,CAAE,WAAA,CAAAnD,CAAAA,CAAa,UAAA,CAAY,IAAA,CAAM,WAAA,CAAAP,CAAY,CAAC,EACtF,CAAA,CAAG,CAACI,CAAAA,CAAQG,CAAAA,CAAaP,CAAAA,CAAa0D,CAAS,CAAC,CAAA,CAE1CI,EAAAA,CAAiBH,iBAAAA,CAAY,IAAM,CACvC/C,EAAAA,CAAc,IAAI,CAAA,CAClBF,EAAAA,CAAgB,IAAI,CAAA,CACpBgD,CAAAA,CAAU,eAAA,CAAiB,SAAA,CAAW,CAAE,IAAA,CAAM,MAAA,CAAQ,OAAA,CAAS,+CAAgD,CAAC,EAClH,CAAA,CAAG,CAACA,CAAS,CAAC,CAAA,CAERK,EAAAA,CAAgBJ,iBAAAA,CAAY,SAAY,CAC5C,GAAI,EAAA,CAACvD,CAAAA,EAAU,CAACO,CAAAA,CAAAA,CAChB,CAAAc,CAAAA,CAAiB,SAAS,CAAA,CAE1B,GAAI,CACF,IAAM5C,CAAAA,CAAOZ,EAAAA,EAAa,CAC1BoD,EAAAA,CAAiBxC,CAAI,CAAA,CAErB,IAAIpG,CAAAA,CAEJ,GAAIkI,CAAAA,CACF,MAAMtB,CAAAA,EAAc,CACpB5G,CAAAA,CAAWmG,EAAAA,CAA0BC,CAAI,CAAA,CAAA,KACpC,CACL,IAAMmF,CAAAA,CAAM,MAAM,KAAA,CAAM,CAAA,EAAGhE,CAAW,CAAA,QAAA,CAAA,CAAY,CAChD,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,MAAA,CAAAI,CAAAA,CACA,WAAA,CAAAG,CAAAA,CACA,MAAA,CAAQ,UAAA,CAAWlC,CAAM,CAAA,CACzB,QAAA,CAAAtB,CAAAA,CACA,QAAA,CAAAD,CAAAA,CACA,WAAA,CAAAH,CAAAA,CACA,eAAA,CAAiBwE,EAAAA,CAAY,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CACxC,aAAA,CAAetC,CACjB,CAAC,CACH,CAAC,CAAA,CAEKlG,CAAAA,CAAO,MAAMqL,CAAAA,CAAI,IAAA,EAAK,CAC5B,GAAI,CAACA,CAAAA,CAAI,EAAA,CAAI,MAAM,IAAI,KAAA,CAAMrL,CAAAA,CAAK,KAAA,EAAS,gBAAgB,CAAA,CAC3DF,CAAAA,CAAWE,EACb,CAEA8I,CAAAA,CAAiB,SAAS,CAAA,CAC1BiC,CAAAA,CAAU,SAAA,CAAW,SAAA,CAAWjL,CAAQ,CAAA,CACxCwH,CAAAA,GAAoBxH,CAAQ,EAC9B,CAAA,MAAS6B,CAAAA,CAAK,CACZmH,CAAAA,CAAiB,OAAO,CAAA,CACxB,IAAMxL,CAAAA,CAAUqE,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,gBAAA,CACrDoJ,CAAAA,CAAU,SAAA,CAAW,OAAA,CAAS,MAAA,CAAWzN,CAAO,CAAA,CAChDkK,CAAAA,GAAU7F,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAMrE,CAAO,CAAC,EAC3D,CAAA,CACF,CAAA,CAAG,CAACmK,CAAAA,CAAQJ,CAAAA,CAAaO,CAAAA,CAAaI,CAAAA,CAAYtC,CAAAA,CAAQtB,CAAAA,CAAUD,CAAAA,CAAUH,CAAAA,CAAawE,EAAAA,CAAauC,CAAAA,CAAWzD,CAAAA,CAAmBE,CAAO,CAAC,CAAA,CAExI8D,EAAAA,CAAeN,iBAAAA,CAAY,SAAY,CAC3C,GAAI,EAAA,CAACvD,CAAAA,EAAU,CAACO,CAAAA,CAAAA,CAChB,CAAAc,CAAAA,CAAiB,SAAS,CAAA,CAE1B,GAAI,CACF,IAAM5C,CAAAA,CAAOZ,EAAAA,EAAa,CAC1BoD,EAAAA,CAAiBxC,CAAI,CAAA,CAErB,IAAIpG,CAAAA,CAEJ,GAAIkI,CAAAA,CACF,MAAMtB,CAAAA,EAAc,CACpB5G,CAAAA,CAAWqG,EAAAA,CAAyBD,CAAI,CAAA,CAAA,KACnC,CACL,IAAMmF,CAAAA,CAAM,MAAM,KAAA,CAAM,CAAA,EAAGhE,CAAW,CAAA,OAAA,CAAA,CAAW,CAC/C,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,MAAA,CAAAI,CAAAA,CACA,WAAA,CAAAG,CAAAA,CACA,MAAA,CAAQ,UAAA,CAAWlC,CAAM,CAAA,CACzB,QAAA,CAAAtB,CAAAA,CACA,QAAA,CAAAD,CAAAA,CACA,WAAA,CAAAH,CAAAA,CACA,aAAA,CAAekC,CACjB,CAAC,CACH,CAAC,CAAA,CAEKlG,CAAAA,CAAO,MAAMqL,CAAAA,CAAI,IAAA,EAAK,CAC5B,GAAI,CAACA,CAAAA,CAAI,EAAA,CAAI,MAAM,IAAI,KAAA,CAAMrL,CAAAA,CAAK,KAAA,EAAS,eAAe,CAAA,CAC1DF,CAAAA,CAAWE,EACb,CAEA8I,CAAAA,CAAiB,SAAS,CAAA,CAC1BiC,CAAAA,CAAU,QAAA,CAAU,SAAA,CAAWjL,CAAQ,CAAA,CACvCyH,CAAAA,GAAmBzH,CAAQ,EAC7B,CAAA,MAAS6B,CAAAA,CAAK,CACZmH,CAAAA,CAAiB,OAAO,CAAA,CACxB,IAAMxL,CAAAA,CAAUqE,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,eAAA,CACrDoJ,CAAAA,CAAU,QAAA,CAAU,OAAA,CAAS,MAAA,CAAWzN,CAAO,CAAA,CAC/CkK,CAAAA,GAAU7F,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAMrE,CAAO,CAAC,EAC3D,CAAA,CACF,CAAA,CAAG,CAACmK,CAAAA,CAAQJ,CAAAA,CAAaO,CAAAA,CAAaI,CAAAA,CAAYtC,CAAAA,CAAQtB,CAAAA,CAAUD,CAAAA,CAAUH,CAAAA,CAAa+G,CAAAA,CAAWxD,CAAAA,CAAkBC,CAAO,CAAC,CAAA,CAE1H+D,EAAAA,CAAoBP,iBAAAA,CAAY,SAAY,CAChD,GAAK,CAACvD,CAAAA,EAAU,CAACO,CAAAA,EAAe,CAACtG,CAAAA,CAAe,CAC9CqJ,CAAAA,CAAU,cAAA,CAAgB,OAAA,CAAS,MAAA,CAAW,mBAAmB,CAAA,CACjE,MACF,CACAjC,CAAAA,CAAiB,SAAS,CAAA,CAE1B,GAAI,CACF,IAAIhJ,CAAAA,CAEJ,GAAIkI,CAAAA,CACF,MAAMtB,CAAAA,EAAc,CACpB5G,CAAAA,CAAWsG,EAAAA,CAAyB1E,CAAa,CAAA,CAAA,KAC5C,CACL,IAAM2J,CAAAA,CAAM,MAAM,KAAA,CAAM,CAAA,EAAGhE,CAAW,CAAA,OAAA,CAAA,CAAW,CAC/C,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,MAAA,CAAAI,CAAAA,CAAQ,WAAA,CAAAG,CAAAA,CAAa,aAAA,CAAAlG,CAAc,CAAC,CAC7D,CAAC,CAAA,CAEK1B,CAAAA,CAAO,MAAMqL,CAAAA,CAAI,IAAA,EAAK,CAC5B,GAAI,CAACA,CAAAA,CAAI,EAAA,CAAI,MAAM,IAAI,KAAA,CAAMrL,CAAAA,CAAK,KAAA,EAAS,qBAAqB,CAAA,CAChEF,CAAAA,CAAWE,EACb,CAEA8I,CAAAA,CAAiB,SAAS,CAAA,CAC1BiC,CAAAA,CAAU,cAAA,CAAgB,SAAA,CAAWjL,CAAQ,EAC/C,CAAA,MAAS6B,CAAAA,CAAK,CACZmH,CAAAA,CAAiB,OAAO,CAAA,CACxB,IAAMxL,CAAAA,CAAUqE,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,qBAAA,CACrDoJ,CAAAA,CAAU,cAAA,CAAgB,OAAA,CAAS,MAAA,CAAWzN,CAAO,CAAA,CACrDkK,CAAAA,GAAU7F,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAMrE,CAAO,CAAC,EAC3D,CACF,CAAA,CAAG,CAACmK,CAAAA,CAAQJ,CAAAA,CAAaO,CAAAA,CAAaI,CAAAA,CAAYtG,CAAAA,CAAeqJ,CAAAA,CAAWvD,CAAO,CAAC,CAAA,CAE9EgE,EAAAA,CAAwBR,iBAAAA,CAAY,SAAY,CACpD,GAAI,EAAA,CAACvD,CAAAA,EAAU,CAACO,CAAAA,CAAAA,CAChB,CAAAc,CAAAA,CAAiB,SAAS,CAAA,CAE1B,GAAI,CACF,IAAIhJ,CAAAA,CAEJ,GAAIkI,CAAAA,CACF,MAAMtB,CAAAA,EAAc,CACpB5G,CAAAA,CAAWuG,EAAAA,EAA+B,CAAA,KACrC,CACL,IAAMgF,CAAAA,CAAM,MAAM,KAAA,CAAM,CAAA,EAAGhE,CAAW,CAAA,aAAA,CAAA,CAAiB,CACrD,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,MAAA,CAAAI,CAAAA,CAAQ,WAAA,CAAAG,CAAY,CAAC,CAC9C,CAAC,CAAA,CAEK5H,CAAAA,CAAO,MAAMqL,CAAAA,CAAI,IAAA,EAAK,CAC5B,GAAI,CAACA,CAAAA,CAAI,EAAA,CAAI,MAAM,IAAI,KAAA,CAAMrL,CAAAA,CAAK,KAAA,EAAS,2BAA2B,CAAA,CACtEF,CAAAA,CAAWE,EACb,CAEA8I,CAAAA,CAAiB,SAAS,CAAA,CAC1BiC,CAAAA,CAAU,uBAAA,CAAyB,SAAA,CAAWjL,CAAQ,EACxD,CAAA,MAAS6B,CAAAA,CAAK,CACZmH,CAAAA,CAAiB,OAAO,CAAA,CACxB,IAAMxL,CAAAA,CAAUqE,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,2BAAA,CACrDoJ,CAAAA,CAAU,uBAAA,CAAyB,OAAA,CAAS,MAAA,CAAWzN,CAAO,CAAA,CAC9DkK,CAAAA,GAAU7F,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAMrE,CAAO,CAAC,EAC3D,CAAA,CACF,CAAA,CAAG,CAACmK,CAAAA,CAAQJ,CAAAA,CAAaO,CAAAA,CAAaI,CAAAA,CAAY+C,CAAAA,CAAWvD,CAAO,CAAC,CAAA,CAE/DiE,EAAAA,CAAwBT,iBAAAA,CAAY,SAAY,CACpD,GAAI,EAAA,CAACvD,CAAAA,EAAU,CAACO,CAAAA,CAAAA,CAChB,CAAAc,CAAAA,CAAiB,SAAS,CAAA,CAE1B,GAAI,CACF,IAAIhJ,CAAAA,CAEJ,GAAIkI,CAAAA,CACF,MAAMtB,CAAAA,EAAc,CACpB5G,CAAAA,CAAWwG,EAAAA,CAA0BtC,CAAW,CAAA,CAAA,KAC3C,CACL,IAAMqH,CAAAA,CAAM,MAAM,KAAA,CAAM,CAAA,EAAGhE,CAAW,CAAA,iBAAA,CAAA,CAAqB,CACzD,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,MAAA,CAAAI,CAAAA,CAAQ,WAAA,CAAAG,CAAAA,CAAa,WAAA,CAAA5D,CAAY,CAAC,CAC3D,CAAC,CAAA,CAEKhE,CAAAA,CAAO,MAAMqL,CAAAA,CAAI,IAAA,EAAK,CAC5B,GAAI,CAACA,CAAAA,CAAI,EAAA,CAAI,MAAM,IAAI,KAAA,CAAMrL,CAAAA,CAAK,KAAA,EAAS,mBAAmB,CAAA,CAC9DF,CAAAA,CAAWE,EACb,CAEA8I,CAAAA,CAAiB,SAAS,CAAA,CAC1BiC,CAAAA,CAAU,kBAAA,CAAoB,SAAA,CAAWjL,CAAQ,EACnD,CAAA,MAAS6B,CAAAA,CAAK,CACZmH,CAAAA,CAAiB,OAAO,CAAA,CACxB,IAAMxL,CAAAA,CAAUqE,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,mBAAA,CACrDoJ,CAAAA,CAAU,kBAAA,CAAoB,OAAA,CAAS,MAAA,CAAWzN,CAAO,CAAA,CACzDkK,CAAAA,GAAU7F,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAMrE,CAAO,CAAC,EAC3D,CAAA,CACF,CAAA,CAAG,CAACmK,CAAAA,CAAQJ,CAAAA,CAAaO,CAAAA,CAAaI,CAAAA,CAAYhE,CAAAA,CAAa+G,CAAAA,CAAWvD,CAAO,CAAC,CAAA,CAE5EkE,EAAAA,CAAwBV,iBAAAA,CAAY,SAAY,CACpD,GAAI,EAAA,CAACvD,CAAAA,EAAU,CAACO,CAAAA,CAAAA,CAChB,CAAAc,CAAAA,CAAiB,SAAS,CAAA,CAE1B,GAAI,CACF,IAAIhJ,CAAAA,CAEJ,GAAIkI,CAAAA,CACF,MAAMtB,CAAAA,EAAc,CACpB5G,CAAAA,CAAWyG,EAAAA,EAA+B,CAAA,KACrC,CACL,IAAM8E,CAAAA,CAAM,MAAM,KAAA,CAAM,CAAA,EAAGhE,CAAW,CAAA,cAAA,CAAA,CAAkB,CACtD,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,MAAA,CAAAI,CAAAA,CAAQ,WAAA,CAAAG,CAAY,CAAC,CAC9C,CAAC,CAAA,CAEK5H,CAAAA,CAAO,MAAMqL,CAAAA,CAAI,IAAA,EAAK,CAC5B,GAAI,CAACA,CAAAA,CAAI,EAAA,CAAI,MAAM,IAAI,KAAA,CAAMrL,CAAAA,CAAK,KAAA,EAAS,sBAAsB,CAAA,CACjEF,CAAAA,CAAWE,EACb,CAEA8I,CAAAA,CAAiB,SAAS,CAAA,CAC1BiC,CAAAA,CAAU,sBAAA,CAAwB,SAAA,CAAWjL,CAAQ,EACvD,CAAA,MAAS6B,CAAAA,CAAK,CACZmH,CAAAA,CAAiB,OAAO,CAAA,CACxB,IAAMxL,CAAAA,CAAUqE,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,sBAAA,CACrDoJ,CAAAA,CAAU,sBAAA,CAAwB,OAAA,CAAS,MAAA,CAAWzN,CAAO,CAAA,CAC7DkK,CAAAA,GAAU7F,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAMrE,CAAO,CAAC,EAC3D,CAAA,CACF,CAAA,CAAG,CAACmK,CAAAA,CAAQJ,CAAAA,CAAaO,CAAAA,CAAaI,CAAAA,CAAY+C,CAAAA,CAAWvD,CAAO,CAAC,CAAA,CAE/DmE,EAAAA,CAAsBX,iBAAAA,CAAY,SAAY,CAClD,GAAI,EAAA,CAACvD,CAAAA,EAAU,CAACO,CAAAA,CAAAA,CAChB,CAAAc,CAAAA,CAAiB,SAAS,CAAA,CAE1B,GAAI,CACF,IAAIhJ,CAAAA,CAEJ,GAAIkI,CAAAA,CACF,MAAMtB,CAAAA,EAAc,CACpB5G,CAAAA,CAAW2G,EAAAA,EAA6B,CAAA,KACnC,CACL,IAAM4E,CAAAA,CAAM,MAAM,KAAA,CAAM,CAAA,EAAGhE,CAAW,CAAA,YAAA,CAAA,CAAgB,CACpD,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,MAAA,CAAAI,CAAAA,CAAQ,WAAA,CAAAG,CAAY,CAAC,CAC9C,CAAC,CAAA,CAEK5H,CAAAA,CAAO,MAAMqL,CAAAA,CAAI,IAAA,EAAK,CAC5B,GAAI,CAACA,CAAAA,CAAI,EAAA,CAAI,MAAM,IAAI,KAAA,CAAMrL,CAAAA,CAAK,KAAA,EAAS,2BAA2B,CAAA,CACtEF,CAAAA,CAAWE,EACb,CAEA8I,CAAAA,CAAiB,SAAS,CAAA,CAC1BiC,CAAAA,CAAU,aAAA,CAAe,SAAA,CAAWjL,CAAQ,EAC9C,CAAA,MAAS6B,CAAAA,CAAK,CACZmH,CAAAA,CAAiB,OAAO,CAAA,CACxB,IAAMxL,CAAAA,CAAUqE,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,2BAAA,CACrDoJ,CAAAA,CAAU,aAAA,CAAe,OAAA,CAAS,MAAA,CAAWzN,CAAO,CAAA,CACpDkK,CAAAA,GAAU7F,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAMrE,CAAO,CAAC,EAC3D,CAAA,CACF,CAAA,CAAG,CAACmK,CAAAA,CAAQJ,CAAAA,CAAaO,CAAAA,CAAaI,CAAAA,CAAY+C,CAAAA,CAAWvD,CAAO,CAAC,CAAA,CAE/DoE,EAAAA,CAA0BZ,iBAAAA,CAAY,SAAY,CACtD,GAAI,EAAA,CAACvD,CAAAA,EAAU,CAACO,CAAAA,CAAAA,CAChB,CAAAc,CAAAA,CAAiB,SAAS,CAAA,CAE1B,GAAI,CACF,IAAIhJ,CAAAA,CAEJ,GAAIkI,CAAAA,CACF,MAAMtB,CAAAA,EAAc,CACpB5G,CAAAA,CAAW0G,EAAAA,EAAiC,CAAA,KACvC,CACL,IAAM6E,CAAAA,CAAM,MAAM,KAAA,CAAM,CAAA,EAAGhE,CAAW,CAAA,gBAAA,CAAA,CAAoB,CACxD,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,MAAA,CAAAI,CAAAA,CAAQ,WAAA,CAAAG,CAAY,CAAC,CAC9C,CAAC,CAAA,CAEK5H,CAAAA,CAAO,MAAMqL,CAAAA,CAAI,IAAA,EAAK,CAC5B,GAAI,CAACA,CAAAA,CAAI,EAAA,CAAI,MAAM,IAAI,KAAA,CAAMrL,CAAAA,CAAK,KAAA,EAAS,wBAAwB,CAAA,CACnEF,CAAAA,CAAWE,EACb,CAEA8I,CAAAA,CAAiB,SAAS,CAAA,CAC1BiC,CAAAA,CAAU,iBAAA,CAAmB,SAAA,CAAWjL,CAAQ,EAClD,CAAA,MAAS6B,CAAAA,CAAK,CACZmH,CAAAA,CAAiB,OAAO,CAAA,CACxB,IAAMxL,CAAAA,CAAUqE,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,wBAAA,CACrDoJ,CAAAA,CAAU,iBAAA,CAAmB,OAAA,CAAS,MAAA,CAAWzN,CAAO,CAAA,CACxDkK,CAAAA,GAAU7F,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAMrE,CAAO,CAAC,EAC3D,CAAA,CACF,CAAA,CAAG,CAACmK,CAAAA,CAAQJ,CAAAA,CAAaO,CAAAA,CAAaI,CAAAA,CAAY+C,CAAAA,CAAWvD,CAAO,CAAC,CAAA,CAE/DqE,EAAAA,CAAkBb,iBAAAA,CAAac,CAAAA,EAAiB,CACpD,SAAA,CAAU,SAAA,CAAU,SAAA,CAAUA,CAAI,EACpC,CAAA,CAAG,EAAE,CAAA,CAEL,OAAKhE,CAAAA,CA+FHiE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW,CAAA,UAAA,EAAa5E,CAAS,CAAA,CAAA,CACpC,QAAA,CAAA,CAAA4E,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,mCAAA,CAAoC,QAAA,CAAA,oBAAA,CAAkB,CAAA,CACnEhE,CAAAA,CACCgE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mGAAA,CAAoG,QAAA,CAAA,MAAA,CAEpH,CAAA,CACEpE,CAAAA,GAAgB,YAAA,CAClBoE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mGAAA,CAAoG,QAAA,CAAA,YAAA,CAEpH,CAAA,CAEAA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+FAAA,CAAgG,QAAA,CAAA,SAAA,CAEhH,CAAA,CAAA,CAEJ,CAAA,CACAA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,4BAAA,CACV,QAAA,CAAAhE,CAAAA,CACG,iDAAA,CACAJ,CAAAA,GAAgB,YAAA,CACd,2CAAA,CACA,sCAAA,CAER,CAAA,CAAA,CACF,CAAA,CACAmE,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMhE,EAAAA,CAAgB,KAAK,CAAA,CACpC,SAAA,CAAU,0HAAA,CAEV,QAAA,CAAA,CAAAiE,cAAAA,CAACC,EAAAA,CAAA,EAAa,CAAA,CAAE,aAAA,CAAA,CAElB,CAAA,CAAA,CACF,CAAA,CAEAF,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CAEb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAM5D,CAAAA,CAAa,SAAS,CAAA,CACrC,SAAA,CAAW,CAAA,4GAAA,EACTD,CAAAA,GAAc,SAAA,CAAY,+BAAA,CAAkC,6CAC9D,CAAA,CAAA,CAEA,QAAA,CAAA,CAAA8D,cAAAA,CAACE,EAAAA,CAAA,EAAW,CAAA,CAAE,SAAA,CAAA,CAEhB,CAAA,CACAH,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAM5D,CAAAA,CAAa,QAAQ,CAAA,CACpC,SAAA,CAAW,CAAA,4GAAA,EACTD,CAAAA,GAAc,QAAA,CAAW,+BAAA,CAAkC,6CAC7D,CAAA,CAAA,CAEA,QAAA,CAAA,CAAA8D,cAAAA,CAACG,EAAAA,CAAA,EAAU,CAAA,CAAE,QAAA,CAAA,CAEf,CAAA,CACAJ,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAM5D,CAAAA,CAAa,QAAQ,CAAA,CACpC,SAAA,CAAW,CAAA,4GAAA,EACTD,CAAAA,GAAc,QAAA,CAAW,+BAAA,CAAkC,6CAC7D,CAAA,CAAA,CAEA,QAAA,CAAA,CAAA8D,cAAAA,CAACI,EAAAA,CAAA,EAAY,CAAA,CAAE,QAAA,CAAA,CAEjB,CAAA,CACAL,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAM5D,CAAAA,CAAa,SAAS,CAAA,CACrC,SAAA,CAAW,CAAA,4GAAA,EACTD,CAAAA,GAAc,SAAA,CAAY,+BAAA,CAAkC,6CAC9D,CAAA,CAAA,CAEA,QAAA,CAAA,CAAA8D,cAAAA,CAACK,EAAAA,CAAA,EAAY,CAAA,CAAE,SAAA,CAAA,CAEjB,CAAA,CACAN,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAM5D,CAAAA,CAAa,UAAU,CAAA,CACtC,SAAA,CAAW,CAAA,4GAAA,EACTD,CAAAA,GAAc,UAAA,CAAa,+BAAA,CAAkC,6CAC/D,CAAA,CAAA,CAEA,QAAA,CAAA,CAAA8D,cAAAA,CAACM,EAAAA,CAAA,EAAU,CAAA,CAAE,UAAA,CAAA,CAEf,CAAA,CACAP,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAM5D,CAAAA,CAAa,UAAU,CAAA,CACtC,SAAA,CAAW,CAAA,4GAAA,EACTD,CAAAA,GAAc,UAAA,CAAa,+BAAA,CAAkC,6CAC/D,CAAA,CAAA,CAEA,QAAA,CAAA,CAAA8D,cAAAA,CAACO,EAAAA,CAAA,EAAY,CAAA,CAAE,UAAA,CAAA,CAEjB,CAAA,CAAA,CACF,CAAA,CAGCrE,CAAAA,GAAc,SAAA,EACb6D,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,kBAAA,CAAgB,CAAA,CAC9CA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CAAgC,QAAA,CAAA,0CAAA,CAAwC,CAAA,CAAA,CACvF,CAAA,CAEAD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,cAAA,CAAY,CAAA,CACnDA,cAAAA,CAAC,OAAA,CAAA,CACC,WAAA,CAAY,cAAA,CACZ,KAAA,CAAOhI,CAAAA,CACP,QAAA,CAAW9F,CAAAA,EAAMkK,EAAAA,CAAelK,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC9C,SAAA,CAAU,0GAAA,CACZ,CAAA,CAAA,CACF,CAAA,CACA6N,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,QAAA,CAAM,CAAA,CAC7CA,cAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,WAAA,CAAY,MAAA,CACZ,KAAA,CAAOtG,CAAAA,CACP,QAAA,CAAWxH,CAAAA,EAAMmK,EAAAA,CAAUnK,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CACzC,SAAA,CAAU,0GAAA,CACZ,CAAA,CAAA,CACF,CAAA,CACA6N,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,UAAA,CAAQ,CAAA,CAC/CA,cAAAA,CAAC,QAAA,CAAA,CACC,KAAA,CAAO5H,CAAAA,CACP,QAAA,CAAWlG,CAAAA,EAAMoK,EAAAA,CAAYpK,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC3C,SAAA,CAAU,0GAAA,CAET,QAAA,CAAA6I,EAAAA,CAAiB,GAAA,CAAKxB,CAAAA,EACrByG,cAAAA,CAAC,QAAA,CAAA,CAAqB,KAAA,CAAOzG,CAAAA,CAAE,KAAA,CAAQ,QAAA,CAAAA,CAAAA,CAAE,KAAA,CAAA,CAA5BA,CAAAA,CAAE,KAAgC,CAChD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACAwG,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,UAAA,CAAQ,CAAA,CAC/CA,cAAAA,CAAC,QAAA,CAAA,CACC,KAAA,CAAO7H,CAAAA,CACP,QAAA,CAAWjG,CAAAA,EAAMqK,EAAAA,CAAYrK,CAAAA,CAAE,MAAA,CAAO,KAAsB,CAAA,CAC5D,SAAA,CAAU,0GAAA,CAET,QAAA,CAAA4I,EAAAA,CAAiB,GAAA,CAAKvB,CAAAA,EACrBwG,eAAAA,CAAC,QAAA,CAAA,CAAqB,KAAA,CAAOxG,CAAAA,CAAE,KAAA,CAAQ,QAAA,CAAA,CAAAA,CAAAA,CAAE,KAAA,CAAM,IAAA,CAAGA,CAAAA,CAAE,OAAA,CAAQ,GAAA,CAAA,CAAA,CAA/CA,CAAAA,CAAE,KAA8C,CAC9D,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACAwG,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,+BAAA,CAA6B,CAAA,CACpEA,cAAAA,CAAC,OAAA,CAAA,CACC,WAAA,CAAY,qBAAA,CACZ,KAAA,CAAOxD,EAAAA,CACP,QAAA,CAAWtK,CAAAA,EAAMuK,EAAAA,CAAevK,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC9C,SAAA,CAAW,EAAA,CACX,SAAA,CAAU,0GAAA,CACZ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEA6N,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASX,EAAAA,CACT,QAAA,CAAUvC,CAAAA,GAAkB,SAAA,CAC5B,SAAA,CAAU,yKAAA,CAET,QAAA,CAAA,CAAAA,CAAAA,GAAkB,SAAA,CAAYmD,cAAAA,CAACQ,CAAAA,CAAA,EAAW,CAAA,CAAKR,cAAAA,CAACS,EAAAA,CAAA,EAAS,CAAA,CAAG,iBAAA,CAAA,CAE/D,CAAA,CAAA,CACF,CAAA,CAIDvE,CAAAA,GAAc,QAAA,EACb6D,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,iBAAA,CAAe,CAAA,CAC7CA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CAAgC,QAAA,CAAA,sCAAA,CAAoC,CAAA,CAAA,CACnF,CAAA,CAEAD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,iBAAA,CAAe,CAAA,CACtDA,cAAAA,CAAC,OAAA,CAAA,CACC,WAAA,CAAY,cAAA,CACZ,KAAA,CAAOhI,CAAAA,CACP,QAAA,CAAW9F,CAAAA,EAAMkK,EAAAA,CAAelK,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC9C,SAAA,CAAU,0GAAA,CACZ,CAAA,CAAA,CACF,CAAA,CACA6N,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,QAAA,CAAM,CAAA,CAC7CA,cAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,WAAA,CAAY,MAAA,CACZ,KAAA,CAAOtG,CAAAA,CACP,QAAA,CAAWxH,CAAAA,EAAMmK,EAAAA,CAAUnK,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CACzC,SAAA,CAAU,0GAAA,CACZ,CAAA,CAAA,CACF,CAAA,CACA6N,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,UAAA,CAAQ,CAAA,CAC/CA,cAAAA,CAAC,QAAA,CAAA,CACC,KAAA,CAAO5H,CAAAA,CACP,QAAA,CAAWlG,CAAAA,EAAMoK,EAAAA,CAAYpK,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC3C,SAAA,CAAU,0GAAA,CAET,QAAA,CAAA6I,EAAAA,CAAiB,GAAA,CAAKxB,CAAAA,EACrByG,cAAAA,CAAC,QAAA,CAAA,CAAqB,KAAA,CAAOzG,CAAAA,CAAE,KAAA,CAAQ,QAAA,CAAAA,CAAAA,CAAE,KAAA,CAAA,CAA5BA,CAAAA,CAAE,KAAgC,CAChD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACAwG,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,UAAA,CAAQ,CAAA,CAC/CA,cAAAA,CAAC,QAAA,CAAA,CACC,KAAA,CAAO7H,CAAAA,CACP,QAAA,CAAWjG,CAAAA,EAAMqK,EAAAA,CAAYrK,CAAAA,CAAE,MAAA,CAAO,KAAsB,CAAA,CAC5D,SAAA,CAAU,0GAAA,CAET,QAAA,CAAA4I,EAAAA,CAAiB,GAAA,CAAKvB,CAAAA,EACrBwG,eAAAA,CAAC,QAAA,CAAA,CAAqB,KAAA,CAAOxG,CAAAA,CAAE,KAAA,CAAQ,QAAA,CAAA,CAAAA,CAAAA,CAAE,KAAA,CAAM,IAAA,CAAGA,CAAAA,CAAE,OAAA,CAAQ,GAAA,CAAA,CAAA,CAA/CA,CAAAA,CAAE,KAA8C,CAC9D,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEAwG,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAST,EAAAA,CACT,QAAA,CAAUzC,CAAAA,GAAkB,SAAA,CAC5B,SAAA,CAAU,yKAAA,CAET,QAAA,CAAA,CAAAA,CAAAA,GAAkB,SAAA,CAAYmD,cAAAA,CAACQ,CAAAA,CAAA,EAAW,CAAA,CAAKR,cAAAA,CAACS,EAAAA,CAAA,EAAS,CAAA,CAAG,gBAAA,CAAA,CAE/D,CAAA,CAAA,CACF,CAAA,CAIDvE,CAAAA,GAAc,QAAA,EACb6D,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,0BAAA,CAAwB,CAAA,CACtDA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CAAgC,QAAA,CAAA,mCAAA,CAAiC,CAAA,CAAA,CAChF,CAAA,CAEAD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,gBAAA,CAAc,CAAA,CACrDD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CACC,WAAA,CAAY,6BAAA,CACZ,KAAA,CAAOtK,CAAAA,CACP,QAAA,CAAWxD,CAAAA,EAAMwK,EAAAA,CAAiBxK,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAChD,SAAA,CAAU,oHAAA,CACZ,CAAA,CACCwD,CAAAA,EACCsK,cAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMH,EAAAA,CAAgBnK,CAAa,CAAA,CAC5C,SAAA,CAAU,8GAAA,CACV,KAAA,CAAM,mBAAA,CAEN,QAAA,CAAAsK,cAAAA,CAACU,EAAAA,CAAA,EAAS,CAAA,CACZ,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAEAX,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASR,EAAAA,CACT,QAAA,CAAU1C,CAAAA,GAAkB,SAAA,EAAa,CAACnH,CAAAA,CAC1C,SAAA,CAAU,yKAAA,CAET,QAAA,CAAA,CAAAmH,CAAAA,GAAkB,SAAA,CAAYmD,cAAAA,CAACQ,CAAAA,CAAA,EAAW,CAAA,CAAKR,cAAAA,CAACI,EAAAA,CAAA,EAAY,CAAA,CAAG,cAAA,CAAA,CAElE,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAIDlE,CAAAA,GAAc,SAAA,EACb6D,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,kBAAA,CAAgB,CAAA,CAC9CA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CAAgC,QAAA,CAAA,0CAAA,CAAwC,CAAA,CAAA,CACvF,CAAA,CAEAD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,cAAA,CAAY,CAAA,CACnDA,cAAAA,CAAC,OAAA,CAAA,CACC,WAAA,CAAY,kBAAA,CACZ,KAAA,CAAOhI,CAAAA,CACP,QAAA,CAAW9F,CAAAA,EAAMkK,EAAAA,CAAelK,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC9C,SAAA,CAAU,0GAAA,CACZ,CAAA,CAAA,CACF,CAAA,CAEA6N,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASN,EAAAA,CACT,QAAA,CAAU5C,CAAAA,GAAkB,SAAA,CAC5B,SAAA,CAAU,yKAAA,CAET,QAAA,CAAA,CAAAA,CAAAA,GAAkB,SAAA,CAAYmD,cAAAA,CAACQ,CAAAA,CAAA,EAAW,CAAA,CAAKR,cAAAA,CAACW,EAAAA,CAAA,EAAW,CAAA,CAAG,kBAAA,CAAA,CAEjE,CAAA,CAAA,CACF,CAAA,CAEAZ,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASP,EAAAA,CACT,QAAA,CAAU3C,CAAAA,GAAkB,SAAA,CAC5B,SAAA,CAAU,8JAAA,CAEV,QAAA,CAAA,CAAAmD,cAAAA,CAACY,EAAAA,CAAA,EAAW,CAAA,CAAE,uBAAA,CAAA,CAEhB,CAAA,CACAb,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASL,EAAAA,CACT,QAAA,CAAU7C,CAAAA,GAAkB,SAAA,CAC5B,SAAA,CAAU,8JAAA,CAEV,QAAA,CAAA,CAAAmD,cAAAA,CAACC,EAAAA,CAAA,EAAa,CAAA,CAAE,eAAA,CAAA,CAElB,CAAA,CACAF,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASJ,EAAAA,CACT,QAAA,CAAU9C,CAAAA,GAAkB,SAAA,CAC5B,SAAA,CAAU,8JAAA,CAEV,QAAA,CAAA,CAAAmD,cAAAA,CAACa,EAAAA,CAAA,EAAQ,CAAA,CAAE,aAAA,CAAA,CAEb,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAID3E,CAAAA,GAAc,UAAA,EACb6D,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,iBAAA,CAAe,CAAA,CAC7CA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CAAgC,QAAA,CAAA,oCAAA,CAAkC,CAAA,CAAA,CACjF,CAAA,CAEAD,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASH,EAAAA,CACT,QAAA,CAAU/C,CAAAA,GAAkB,SAAA,CAC5B,SAAA,CAAU,yKAAA,CAET,QAAA,CAAA,CAAAA,CAAAA,GAAkB,SAAA,CAAYmD,cAAAA,CAACQ,CAAAA,CAAA,EAAW,CAAA,CAAKR,cAAAA,CAACE,EAAAA,CAAA,EAAW,CAAA,CAAG,qBAAA,CAAA,CAEjE,CAAA,CAAA,CACF,CAAA,CAEAH,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,YAAA,CAAU,CAAA,CACxCA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CAAgC,QAAA,CAAA,gDAAA,CAA8C,CAAA,CAAA,CAC7F,CAAA,CAEAD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CAAgD,QAAA,CAAA,CAAA,iFAAA,CAE7DC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wCAAA,CAChC,QAAA,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA,CAAA,CAMiB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAID9D,CAAAA,GAAc,YACb6D,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CAEb,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,gBAAA,CAAc,CAAA,CAC5CA,cAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,+BAAA,CAAgC,QAAA,CAAA,gDAAA,CAA8C,CAAA,CAAA,CAC7F,CAAA,CACAD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,YAAA,CAAU,EACjDA,cAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,MAAA,CACL,WAAA,CAAY,WAAA,CACZ,KAAA,CAAOjD,EAAAA,CACP,QAAA,CAAW7K,CAAAA,EAAM8K,EAAAA,CAAiB9K,CAAAA,CAAE,MAAA,CAAO,KAAK,EAChD,SAAA,CAAU,oHAAA,CACZ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGA6N,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAG,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,mBAAA,CAAiB,CAAA,CAC/CA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CAAgC,QAAA,CAAA,0CAAA,CAAwC,CAAA,CAAA,CACvF,CAAA,CAEAD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,YAAA,CAAU,CAAA,CACjDA,cAAAA,CAAC,QAAA,CAAA,CACC,MAAO7C,CAAAA,CACP,QAAA,CAAWjL,CAAAA,EAAMkL,EAAAA,CAAoBlL,CAAAA,CAAE,MAAA,CAAO,KAAyB,CAAA,CACvE,SAAA,CAAU,0GAAA,CAET,QAAA,CAAA8H,EAAAA,CAAoB,GAAA,CAAK8G,CAAAA,EACxBd,eAAC,QAAA,CAAA,CAAkB,KAAA,CAAOc,CAAAA,CAAO,QAAA,CAAAA,CAAAA,CAAAA,CAApBA,CAAyB,CACvC,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACAf,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,UAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,QAAA,CAAM,CAAA,CAC7CA,cAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,WAAA,CAAY,MAAA,CACZ,KAAA,CAAO3C,EAAAA,CACP,SAAWnL,CAAAA,EAAMoL,EAAAA,CAAiBpL,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAChD,SAAA,CAAU,0GAAA,CACZ,CAAA,CAAA,CACF,CAAA,CACA6N,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,UAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,cAAA,CAAY,CAAA,CACnDA,cAAAA,CAAC,OAAA,CAAA,CACC,WAAA,CAAY,cAAA,CACZ,KAAA,CAAOzC,EAAAA,CACP,QAAA,CAAWrL,CAAAA,EAAMsL,GAAgBtL,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC/C,SAAA,CAAU,0GAAA,CACZ,CAAA,CAAA,CACF,CAAA,CACA6N,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,SAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,UAAA,CAAQ,CAAA,CAC/CA,cAAAA,CAAC,QAAA,CAAA,CACC,KAAA,CAAOvC,EAAAA,CACP,QAAA,CAAWvL,CAAAA,EAAMwL,EAAAA,CAAmBxL,CAAAA,CAAE,MAAA,CAAO,KAAsB,EACnE,SAAA,CAAU,0GAAA,CAET,QAAA,CAAA4I,EAAAA,CAAiB,GAAA,CAAKnE,CAAAA,EACrBoJ,eAAAA,CAAC,QAAA,CAAA,CAAqB,KAAA,CAAOpJ,CAAAA,CAAE,KAAA,CAAQ,QAAA,CAAA,CAAAA,CAAAA,CAAE,KAAA,CAAM,KAAGA,CAAAA,CAAE,OAAA,CAAQ,GAAA,CAAA,CAAA,CAA/CA,CAAAA,CAAE,KAA8C,CAC9D,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEAoJ,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,SAAY,CACnB,IAAMrI,CAAAA,CAAQqC,EAAAA,CAAgBoD,CAAAA,CAAkB,CAC9C,MAAA,CAAQE,GACR,WAAA,CAAaE,EAAAA,CACb,aAAA,CAAeE,EACjB,CAAC,CAAA,CACKtG,EAAU,IAAA,CAAK,SAAA,CAAUO,CAAAA,CAAO,IAAA,CAAM,CAAC,CAAA,CACvCN,CAAAA,CAAY,MAAMuD,EAAAA,CAAkB,IAAA,CAAK,SAAA,CAAUjD,CAAK,CAAA,CAAGqF,EAAa,EAC9Ea,EAAAA,CAAoBzG,CAAO,CAAA,CAC3B2G,EAAAA,CAAsB1G,CAAS,CAAA,CAG/B,IAAM2J,CAAAA,CAA6B,CACjC,EAAA,CAAIzH,EAAAA,EAAa,CACjB,SAAA,CAAW6D,CAAAA,CACX,QAASzF,CAAAA,CACT,SAAA,CAAAN,CAAAA,CACA,UAAA,CAAY,IAAI,IAAA,EAAK,CAAE,kBAAA,EAAmB,CAC1C,UAAA,CAAY,IACd,CAAA,CACA8F,EAAAA,CAAkB+B,EAAAA,EAAS,CAAC8B,CAAAA,CAAU,GAAG9B,EAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAC,CAAA,CAC3DF,CAAAA,CAAU,kBAAA,CAAoB,SAAA,CAAW,CAAE,SAAA,CAAW5B,EAAkB,OAAA,CAASzF,CAAAA,CAAM,OAAQ,CAAC,EAClG,CAAA,CACA,SAAA,CAAU,qJAAA,CAEV,QAAA,CAAA,CAAAsI,cAAAA,CAACS,EAAAA,CAAA,EAAS,CAAA,CAAE,gBAAA,CAAA,CAEd,EAEC9C,EAAAA,EACCoC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,sBAAsB,QAAA,CAAA,mBAAA,CAAiB,CAAA,CACxDA,cAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMH,EAAAA,CAAgBlC,EAAgB,CAAA,CAC/C,SAAA,CAAU,qDAAA,CACX,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,CAAA,CACAqC,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CACZ,QAAA,CAAArC,EAAAA,CACH,CAAA,CACAoC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,sBAAsB,QAAA,CAAA,YAAA,CAAU,CAAA,CACjDA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,6DAAA,CACb,QAAA,CAAAnC,EAAAA,CACH,CAAA,CACAmC,cAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMH,EAAAA,CAAgBhC,EAAkB,CAAA,CACjD,SAAA,CAAU,8GAAA,CAEV,QAAA,CAAAmC,cAAAA,CAACU,EAAAA,CAAA,EAAS,CAAA,CACZ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAGAX,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,oBAAA,CAAkB,CAAA,CAChDA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,gCAAgC,QAAA,CAAA,qCAAA,CAAmC,CAAA,CAAA,CAClF,CAAA,CAEAD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,SAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,gBAAA,CAAc,CAAA,CACrDA,cAAAA,CAAC,UAAA,CAAA,CACC,WAAA,CAAY,2DAAA,CACZ,KAAA,CAAOjC,EAAAA,CACP,QAAA,CAAW7L,CAAAA,EAAM8L,EAAAA,CAAiB9L,CAAAA,CAAE,OAAO,KAAK,CAAA,CAChD,IAAA,CAAM,CAAA,CACN,SAAA,CAAU,iIAAA,CACZ,CAAA,CAAA,CACF,CAAA,CACA6N,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,WAAA,CAAS,CAAA,CAChDA,cAAAA,CAAC,OAAA,CAAA,CACC,WAAA,CAAY,uBAAA,CACZ,KAAA,CAAO/B,GACP,QAAA,CAAW/L,CAAAA,EAAMgM,EAAAA,CAAmBhM,CAAAA,CAAE,MAAA,CAAO,KAAK,EAClD,SAAA,CAAU,oHAAA,CACZ,CAAA,CAAA,CACF,CAAA,CACA6N,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,QAAA,CAAM,CAAA,CAC7CA,cAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,UAAA,CACL,WAAA,CAAY,WAAA,CACZ,MAAO7B,EAAAA,CACP,QAAA,CAAWjM,CAAAA,EAAMkM,EAAAA,CAAgBlM,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC/C,SAAA,CAAU,oHAAA,CACZ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEA6N,eAAAA,CAAC,UACC,OAAA,CAAS,SAAY,CACnB,GAAI,CACF,IAAMiB,CAAAA,CAAgB,IAAA,CAAK,KAAA,CAAMjD,EAAa,CAAA,CACxCkD,CAAAA,CAAoB,MAAMtG,EAAAA,CAAkB,KAAK,SAAA,CAAUqG,CAAa,CAAA,CAAG7C,EAAY,CAAA,CACvF+C,CAAAA,CAAUD,CAAAA,GAAsBhD,EAAAA,CACtCK,EAAAA,CAAgB4C,CAAO,CAAA,CACvBnC,CAAAA,CAAU,kBAAA,CAAoBmC,CAAAA,CAAU,UAAY,OAAA,CAAS,CAC3D,OAAA,CAAAA,CAAAA,CACA,QAAA,CAAUD,CAAAA,CACV,QAAA,CAAUhD,EACZ,CAAC,EACH,CAAA,KAAQ,CACNK,EAAAA,CAAgB,KAAK,EACrBS,CAAAA,CAAU,kBAAA,CAAoB,OAAA,CAAS,MAAA,CAAW,sBAAsB,EAC1E,CACF,CAAA,CACA,SAAA,CAAU,qJAAA,CAEV,QAAA,CAAA,CAAAiB,cAAAA,CAACmB,EAAAA,CAAA,EAAW,EAAE,kBAAA,CAAA,CAEhB,CAAA,CAEC9C,CAAAA,GAAiB,IAAA,EAChB0B,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW,CAAA,oCAAA,EACd1B,CAAAA,CAAe,mEAAA,CAAsE,2DACvF,CAAA,CAAA,CACG,QAAA,CAAA,CAAAA,CAAAA,CAAe2B,eAACoB,EAAAA,CAAA,CAAU,SAAA,CAAU,gBAAA,CAAiB,CAAA,CAAKpB,cAAAA,CAACqB,EAAAA,CAAA,CAAM,SAAA,CAAU,cAAA,CAAe,CAAA,CAC1FhD,CAAAA,CAAe,oBAAA,CAAuB,sBAAA,CAAA,CACzC,GAEJ,CAAA,CAAA,CACF,CAAA,CAGA0B,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,eAAA,CAAgB,wBAAY,CAAA,CAC1CA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CAAgC,QAAA,CAAA,oCAAA,CAAkC,CAAA,CAAA,CACjF,CAAA,CAEAD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,UAAA,CAAQ,CAAA,CAC/CA,cAAAA,CAAC,UAAA,CAAA,CACC,WAAA,CAAY,4BAAA,CACZ,KAAA,CAAOzB,GACP,QAAA,CAAWrM,CAAAA,EAAMsM,EAAAA,CAActM,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC7C,IAAA,CAAM,CAAA,CACN,SAAA,CAAU,iIAAA,CACZ,CAAA,CAAA,CACF,CAAA,CAEA6N,eAAAA,CAAC,UACC,OAAA,CAAS,IAAM,CACb,GAAI,CACF,IAAMuB,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAM/C,EAAU,CAAA,CACpCG,EAAAA,CAAe4C,CAAM,CAAA,CACrB1C,GAAc,EAAE,CAAA,CAChBG,CAAAA,CAAU,aAAA,CAAe,SAAA,CAAW,CAAE,SAAA,CAAWuC,CAAAA,CAAO,SAAA,CAAW,OAAA,CAASA,CAAAA,CAAO,OAAQ,CAAC,EAC9F,OAASpP,CAAAA,CAAG,CACVwM,EAAAA,CAAe,IAAI,CAAA,CACnBE,EAAAA,CAAc1M,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,cAAc,CAAA,CAC7D6M,CAAAA,CAAU,aAAA,CAAe,QAAS,MAAA,CAAW,cAAc,EAC7D,CACF,CAAA,CACA,SAAA,CAAU,sJAEV,QAAA,CAAA,CAAAiB,cAAAA,CAACuB,EAAAA,CAAA,EAAS,CAAA,CAAE,aAAA,CAAA,CAEd,EAEC5C,EAAAA,EACCqB,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CACZ,QAAA,CAAArB,EAAAA,CACH,CAAA,CAGDF,CAAAA,EACCsB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,WAAA,CAAS,EACjDA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,oBAAA,CAAsB,QAAA,CAAA,MAAA,CAAOvB,CAAAA,CAAY,OAAA,EAAW,KAAK,CAAA,CAAE,CAAA,CAAA,CAC1E,CAAA,CACAsB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,aAAA,CAAW,CAAA,CACnDA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,aAAA,CAAe,QAAA,CAAA,MAAA,CAAOvB,CAAAA,CAAY,SAAA,EAAa,KAAK,CAAA,CAAE,CAAA,CAAA,CACrE,CAAA,CACAsB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,YAAA,CAAU,CAAA,CAClDA,eAAC,GAAA,CAAA,CAAE,SAAA,CAAU,oBAAA,CAAsB,QAAA,CAAA,MAAA,CAAOvB,CAAAA,CAAY,SAAA,EAAa,KAAK,CAAA,CAAE,CAAA,CAAA,CAC5E,CAAA,CACAsB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACb,UAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,SAAA,CAAO,CAAA,CAC/CA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,aAAA,CAAe,QAAA,CAAA,MAAA,CAAQvB,CAAAA,CAAY,IAAA,EAAkC,MAAA,EAAU,KAAK,CAAA,CAAE,CAAA,CAAA,CACrG,CAAA,CAAA,CACF,CAAA,CACAsB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,WAAA,CAAS,EAChDA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CACZ,QAAA,CAAA,IAAA,CAAK,SAAA,CAAUvB,CAAAA,CAAa,IAAA,CAAM,CAAC,CAAA,CACtC,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,EAGAsB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAG,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,WAAA,CAAS,CAAA,CACvCA,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CAAgC,QAAA,CAAA,qCAAA,CAAmC,CAAA,CAAA,CAClF,CAAA,CACAD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,QAAA,CAAA,CACC,KAAA,CAAOlB,CAAAA,CACP,QAAA,CAAW3M,CAAAA,EAAM4M,EAAAA,CAAkB5M,CAAAA,CAAE,MAAA,CAAO,KAAgD,CAAA,CAC5F,SAAA,CAAU,iGAAA,CAEV,UAAA8N,cAAAA,CAAC,QAAA,CAAA,CAAO,KAAA,CAAM,KAAA,CAAM,QAAA,CAAA,KAAA,CAAG,CAAA,CACvBA,cAAAA,CAAC,QAAA,CAAA,CAAO,KAAA,CAAM,SAAA,CAAU,QAAA,CAAA,UAAA,CAAQ,CAAA,CAChCA,cAAAA,CAAC,QAAA,CAAA,CAAO,MAAM,QAAA,CAAS,QAAA,CAAA,SAAA,CAAO,CAAA,CAC9BA,cAAAA,CAAC,QAAA,CAAA,CAAO,KAAA,CAAM,QAAA,CAAS,QAAA,CAAA,SAAA,CAAO,CAAA,CAAA,CAChC,CAAA,CACC/C,EAAAA,CAAc,MAAA,CAAS,CAAA,EACtB+C,cAAAA,CAAC,UACC,OAAA,CAAS,IAAM9C,EAAAA,CAAiB,EAAE,CAAA,CAClC,SAAA,CAAU,qDAAA,CACX,QAAA,CAAA,OAAA,CAED,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAEA8C,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,iDAAA,CACZ,QAAA,CAAA/C,EAAAA,CACE,MAAA,CAAQvF,CAAAA,EAAUmH,CAAAA,GAAmB,OAASnH,CAAAA,CAAM,SAAA,CAAU,UAAA,CAAWmH,CAAc,CAAC,CAAA,CACxF,SAAW,CAAA,CACZmB,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CAAgD,QAAA,CAAA,yDAAA,CAE/D,CAAA,CAEA/C,EAAAA,CACG,MAAA,CAAQvF,CAAAA,EAAUmH,CAAAA,GAAmB,KAAA,EAASnH,CAAAA,CAAM,SAAA,CAAU,WAAWmH,CAAc,CAAC,CAAA,CACxF,GAAA,CAAKnH,CAAAA,EACJqI,eAAAA,CAAC,KAAA,CAAA,CAAmB,SAAA,CAAU,gBAAA,CAC5B,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,UAAAC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAW,CAAA,kCAAA,EACftI,CAAAA,CAAM,SAAA,CAAU,QAAA,CAAS,WAAW,CAAA,CAAI,oEACxCA,CAAAA,CAAM,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,CAAI,2DAAA,CACrC,+DACF,CAAA,CAAA,CACG,QAAA,CAAAA,CAAAA,CAAM,SAAA,CACT,CAAA,CACF,CAAA,CACAsI,cAAAA,CAAC,QAAK,SAAA,CAAU,+BAAA,CAAiC,QAAA,CAAAtI,CAAAA,CAAM,UAAA,CAAW,CAAA,CAAA,CACpE,CAAA,CACAqI,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CAAmD,QAAA,CAAA,CAAA,OAAA,CAC1DrI,CAAAA,CAAM,SAAA,CAAU,MAAM,CAAA,CAAG,EAAE,CAAA,CAAE,KAAA,CAAA,CACrC,CAAA,CAAA,CAAA,CAfQA,CAAAA,CAAM,EAgBhB,CACD,CAAA,CAEP,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAGAqI,eAAAA,CAAC,OAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,SAAA,CAAO,CAAA,CACpCrD,GAAQ,MAAA,CAAS,CAAA,EAChBqD,cAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMpD,EAAAA,CAAW,EAAE,CAAA,CAC5B,SAAA,CAAU,qDAAA,CACX,QAAA,CAAA,OAAA,CAED,CAAA,CAAA,CAEJ,EAEAoD,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yFAAA,CACZ,QAAA,CAAArD,EAAAA,CAAQ,MAAA,GAAW,CAAA,CAClBqD,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CAAgD,QAAA,CAAA,2DAAA,CAE/D,CAAA,CAEArD,GAAQ,GAAA,CAAK3K,CAAAA,EACX+N,eAAAA,CAAC,KAAA,CAAA,CAAoB,SAAA,CAAU,eAAA,CAC7B,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,yBAAA,CACZ,QAAA,CAAA,CAAA/N,CAAAA,CAAO,MAAA,GAAW,SAAA,CACjBgO,cAAAA,CAACoB,EAAAA,CAAA,CAAU,SAAA,CAAU,gBAAA,CAAiB,CAAA,CAEtCpB,cAAAA,CAACqB,EAAAA,CAAA,CAAM,UAAU,cAAA,CAAe,CAAA,CAElCrB,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAhO,CAAAA,CAAO,SAAA,CAAU,CAAA,CAAA,CAC1D,CAAA,CACAgO,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gCAAiC,QAAA,CAAAhO,CAAAA,CAAO,SAAA,CAAU,CAAA,CAAA,CACpE,CAAA,CAECA,CAAAA,CAAO,KAAA,CACNgO,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,sBAAA,CAAwB,QAAA,CAAAhO,CAAAA,CAAO,KAAA,CAAM,EAElDgO,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CACZ,QAAA,CAAA,IAAA,CAAK,SAAA,CAAUhO,CAAAA,CAAO,QAAA,CAAU,IAAA,CAAM,CAAC,CAAA,CAC1C,CAAA,CAAA,CAAA,CAlBMA,CAAAA,CAAO,EAoBjB,CACD,CAAA,CAEL,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAj2BE+N,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW,CAAA,UAAA,EAAa5E,CAAS,CAAA,CAAA,CACpC,QAAA,CAAA,CAAA4E,eAAAA,CAAC,KAAA,CAAA,CACC,UAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,mCAAA,CAAoC,QAAA,CAAA,oBAAA,CAAkB,CAAA,CACpEA,eAAC,GAAA,CAAA,CAAE,SAAA,CAAU,4BAAA,CAA6B,QAAA,CAAA,oDAAA,CAE1C,CAAA,CAAA,CACF,CAAA,CAEAD,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qDAAA,CACb,QAAA,CAAAA,eAACC,EAAAA,CAAA,EAAa,CAAA,CAChB,CAAA,CACAF,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,mBAAA,CAAiB,CAAA,CAC/CA,cAAAA,CAAC,KAAE,SAAA,CAAU,+BAAA,CAAgC,QAAA,CAAA,4BAAA,CAA0B,CAAA,CAAA,CACzE,CAAA,CAAA,CACF,CAAA,CAEAD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,SAAA,CAAO,CAAA,CAC9CA,cAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,UAAA,CACL,WAAA,CAAY,gBAAA,CACZ,KAAA,CAAOvE,EACP,QAAA,CAAWvJ,CAAAA,EAAMwJ,CAAAA,CAAUxJ,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CACzC,SAAA,CAAU,0GAAA,CACZ,CAAA,CAAA,CACF,CAAA,CAEA6N,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,eAAA,CAAa,CAAA,CACpDD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,QAAA,CAAA,CACC,QAAS,IAAMlE,CAAAA,CAAe,SAAS,CAAA,CACvC,SAAA,CAAW,CAAA,gFAAA,EACTD,CAAAA,GAAgB,SAAA,CACZ,wCAAA,CACA,4CACN,CAAA,CAAA,CAEA,QAAA,CAAA,CAAAoE,cAAAA,CAAC,MAAA,CAAA,CAAK,UAAW,CAAA,qBAAA,EAAwBpE,CAAAA,GAAgB,SAAA,CAAY,aAAA,CAAgB,aAAa,CAAA,CAAA,CAAI,CAAA,CAAE,SAAA,CAAA,CAE1G,CAAA,CACAmE,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMlE,CAAAA,CAAe,YAAY,CAAA,CAC1C,SAAA,CAAW,CAAA,gFAAA,EACTD,CAAAA,GAAgB,YAAA,CACZ,0CAAA,CACA,4CACN,CAAA,CAAA,CAEA,QAAA,CAAA,CAAAoE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAW,CAAA,qBAAA,EAAwBpE,CAAAA,GAAgB,aAAe,cAAA,CAAiB,cAAc,CAAA,CAAA,CAAI,CAAA,CAAE,YAAA,CAAA,CAE/G,CAAA,CAAA,CACF,CAAA,CACAoE,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CACV,QAAA,CAAApE,CAAAA,GAAgB,SAAA,CACb,sDACA,4DAAA,CAEN,CAAA,CAAA,CACF,CAAA,CAEAmE,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASb,EAAAA,CACT,SAAA,CAAU,qJAAA,CAEV,QAAA,CAAA,CAAAc,cAAAA,CAACS,EAAAA,CAAA,EAAS,CAAA,CAAE,kBAEd,CAAA,CAEAV,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CAAmC,CAAA,CAClDA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iDAAiD,QAAA,CAAA,IAAA,CAAE,CAAA,CACnEA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CAAmC,CAAA,CAAA,CACpD,CAAA,CAEAD,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASZ,EAAAA,CACT,SAAA,CAAU,gJAAA,CAEV,UAAAa,cAAAA,CAACwB,EAAAA,CAAA,EAAW,CAAA,CAAE,6BAAA,CAAA,CAEhB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CA2wBN,CAGA,IAAMvB,EAAAA,CAAe,IACnBF,eAAAA,CAAC,OAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,QAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,qeAAA,CAAse,CAAA,CAC3iBA,cAAAA,CAAC,QAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,EAAE,kCAAA,CAAmC,CAAA,CAAA,CAC1G,CAAA,CAGIS,EAAAA,CAAW,IACfV,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,YACjE,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,kGAAA,CAAmG,CAAA,CACxKA,cAAAA,CAAC,MAAA,CAAA,CAAK,cAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,oCAAA,CAAqC,CAAA,CAAA,CAC5G,CAAA,CAGIE,EAAAA,CAAa,IACjBF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,UAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,EAAG,CAAA,CAAE,wFAAA,CAAyF,CAAA,CAChK,CAAA,CAGIG,EAAAA,CAAY,IAChBH,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,QAAQ,WAAA,CACjE,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,6EAAA,CAA8E,CAAA,CACrJ,CAAA,CAGII,GAAc,IAClBJ,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,cAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,6GAAA,CAA8G,CAAA,CACrL,CAAA,CAGIQ,CAAAA,CAAa,IACjBR,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAuB,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CAC9E,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,EAAG,CAAA,CAAE,iHAAA,CAAkH,CAAA,CACzL,CAAA,CAGIU,EAAAA,CAAW,IACfV,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,QAAQ,WAAA,CACjE,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,uHAAA,CAAwH,CAAA,CAC/L,CAAA,CAGIoB,GAAY,CAAC,CAAE,SAAA,CAAAjG,CAAAA,CAAY,EAAG,CAAA,GAClC6E,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW,CAAA,QAAA,EAAW7E,CAAS,CAAA,CAAA,CAAI,IAAA,CAAK,MAAA,CAAO,OAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CAChF,QAAA,CAAA6E,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,+CAAA,CAAgD,EACvH,CAAA,CAGIqB,EAAAA,CAAQ,CAAC,CAAE,SAAA,CAAAlG,CAAAA,CAAY,EAAG,CAAA,GAC9B6E,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW,CAAA,QAAA,EAAW7E,CAAS,CAAA,CAAA,CAAI,KAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CAChF,QAAA,CAAA6E,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,EAAE,sEAAA,CAAuE,CAAA,CAC9I,CAAA,CAGIwB,EAAAA,CAAa,IACjBxB,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,YACjE,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,uQAAA,CAAwQ,CAAA,CAC/U,CAAA,CAGIK,EAAAA,CAAc,IAClBN,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,QAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,qeAAA,CAAse,CAAA,CAC3iBA,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,EAAG,CAAA,CAAE,kCAAA,CAAmC,CAAA,CAAA,CAC1G,CAAA,CAGIM,EAAAA,CAAY,IAChBN,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,QAAQ,WAAA,CACjE,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,sMAAA,CAAuM,CAAA,CAC9Q,CAAA,CAGIW,GAAa,IACjBX,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,cAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,6CAAA,CAA8C,CAAA,CACrH,CAAA,CAGIY,EAAAA,CAAa,IACjBZ,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,UAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,EAAG,CAAA,CAAE,yIAAA,CAA0I,CAAA,CACjN,CAAA,CAGIa,EAAAA,CAAU,IACdb,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,QAAQ,WAAA,CACjE,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,4HAAA,CAA6H,CAAA,CACpM,CAAA,CAGIO,GAAc,IAClBP,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,cAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,4BAAA,CAA6B,CAAA,CACpG,CAAA,CAGImB,EAAAA,CAAa,IACjBnB,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,UAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,EAAG,CAAA,CAAE,gMAAA,CAAiM,CAAA,CACxQ,CAAA,CAGIuB,EAAAA,CAAW,IACfvB,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,QAAQ,WAAA,CACjE,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,uCAAA,CAAwC,CAAA,CAC/G,CAAA","file":"index.js","sourcesContent":["export type Environment = 'sandbox' | 'production';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\nexport interface SpaarkPayApiSdkConfig {\n apiKey: string;\n environment: Environment;\n baseUrl?: string;\n callbackUrl?: string;\n timeout?: number;\n retries?: number;\n retryDelay?: number;\n logLevel?: LogLevel;\n}\n\nexport interface ResolvedConfig {\n apiKey: string;\n environment: Environment;\n baseUrl: string;\n callbackUrl?: string;\n timeout: number;\n retries: number;\n retryDelay: number;\n logLevel: LogLevel;\n}\n\nexport const DEFAULT_CONFIG = {\n timeout: 30000,\n retries: 3,\n retryDelay: 1000,\n logLevel: 'info' as LogLevel,\n sandboxUrl: 'https://api.sandbox.pawapay.io',\n productionUrl: 'https://api.pawapay.io',\n} as const;\n","export const ERROR_CODES = {\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n INVALID_PHONE: 'INVALID_PHONE',\n INSUFFICIENT_FUNDS: 'INSUFFICIENT_FUNDS',\n AMOUNT_TOO_LOW: 'AMOUNT_TOO_LOW',\n AMOUNT_TOO_HIGH: 'AMOUNT_TOO_HIGH',\n LIMIT_EXCEEDED: 'LIMIT_EXCEEDED',\n DUPLICATE: 'DUPLICATE',\n MMO_UNAVAILABLE: 'MMO_UNAVAILABLE',\n TIMEOUT: 'TIMEOUT',\n UNAUTHORIZED: 'UNAUTHORIZED',\n RATE_LIMITED: 'RATE_LIMITED',\n SERVER_ERROR: 'SERVER_ERROR',\n NETWORK_ERROR: 'NETWORK_ERROR',\n NOT_FOUND: 'NOT_FOUND',\n REFUND_NOT_ALLOWED: 'REFUND_NOT_ALLOWED',\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport interface ErrorMapping {\n pawapayCode: string;\n sdkCode: ErrorCode;\n httpStatus: number;\n retryable: boolean;\n message: string;\n}\n\nexport const ERROR_MAPPINGS: ErrorMapping[] = [\n {\n pawapayCode: 'INVALID_PHONE_NUMBER',\n sdkCode: ERROR_CODES.INVALID_PHONE,\n httpStatus: 400,\n retryable: false,\n message: 'Invalid phone number format',\n },\n {\n pawapayCode: 'INSUFFICIENT_FUNDS',\n sdkCode: ERROR_CODES.INSUFFICIENT_FUNDS,\n httpStatus: 402,\n retryable: false,\n message: 'Insufficient funds in account',\n },\n {\n pawapayCode: 'AMOUNT_TOO_LOW',\n sdkCode: ERROR_CODES.AMOUNT_TOO_LOW,\n httpStatus: 400,\n retryable: false,\n message: 'Amount below minimum',\n },\n {\n pawapayCode: 'AMOUNT_TOO_HIGH',\n sdkCode: ERROR_CODES.AMOUNT_TOO_HIGH,\n httpStatus: 400,\n retryable: false,\n message: 'Amount exceeds maximum',\n },\n {\n pawapayCode: 'TRANSACTION_LIMIT_EXCEEDED',\n sdkCode: ERROR_CODES.LIMIT_EXCEEDED,\n httpStatus: 400,\n retryable: false,\n message: 'Daily or monthly limit exceeded',\n },\n {\n pawapayCode: 'DUPLICATE_TRANSACTION',\n sdkCode: ERROR_CODES.DUPLICATE,\n httpStatus: 409,\n retryable: false,\n message: 'Transaction ID already used',\n },\n {\n pawapayCode: 'CORRESPONDENT_UNAVAILABLE',\n sdkCode: ERROR_CODES.MMO_UNAVAILABLE,\n httpStatus: 503,\n retryable: true,\n message: 'Mobile Money operator temporarily unavailable',\n },\n {\n pawapayCode: 'CORRESPONDENT_TEMPORARILY_UNAVAILABLE',\n sdkCode: ERROR_CODES.MMO_UNAVAILABLE,\n httpStatus: 503,\n retryable: true,\n message: 'Mobile Money operator temporarily unavailable',\n },\n {\n pawapayCode: 'TIMEOUT',\n sdkCode: ERROR_CODES.TIMEOUT,\n httpStatus: 408,\n retryable: true,\n message: 'Transaction timed out',\n },\n {\n pawapayCode: 'INVALID_API_KEY',\n sdkCode: ERROR_CODES.UNAUTHORIZED,\n httpStatus: 401,\n retryable: false,\n message: 'Invalid or expired API key',\n },\n {\n pawapayCode: 'RATE_LIMIT_EXCEEDED',\n sdkCode: ERROR_CODES.RATE_LIMITED,\n httpStatus: 429,\n retryable: true,\n message: 'Too many requests',\n },\n {\n pawapayCode: 'INTERNAL_ERROR',\n sdkCode: ERROR_CODES.SERVER_ERROR,\n httpStatus: 500,\n retryable: true,\n message: 'Pawapay internal error',\n },\n {\n pawapayCode: 'REFUND_NOT_ALLOWED',\n sdkCode: ERROR_CODES.REFUND_NOT_ALLOWED,\n httpStatus: 400,\n retryable: false,\n message: 'Refund not allowed for this transaction',\n },\n];\n\nexport function getErrorMapping(pawapayCode: string): ErrorMapping | undefined {\n return ERROR_MAPPINGS.find((m) => m.pawapayCode === pawapayCode);\n}\n","import type { FailureReason } from '../types/transactions';\nimport { ERROR_CODES, type ErrorCode, getErrorMapping } from '../constants/errors';\n\nexport class PawapayError extends Error {\n readonly code: ErrorCode;\n readonly statusCode: number;\n readonly failureReason?: FailureReason;\n readonly retryable: boolean;\n readonly originalError?: Error;\n\n constructor(\n message: string,\n code: ErrorCode,\n statusCode: number,\n options?: {\n failureReason?: FailureReason;\n retryable?: boolean;\n originalError?: Error;\n }\n ) {\n super(message);\n this.name = 'PawapayError';\n this.code = code;\n this.statusCode = statusCode;\n this.failureReason = options?.failureReason;\n this.retryable = options?.retryable ?? false;\n this.originalError = options?.originalError;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PawapayError);\n }\n }\n\n static fromPawapayResponse(\n pawapayCode: string,\n message?: string,\n originalError?: Error\n ): PawapayError {\n const mapping = getErrorMapping(pawapayCode);\n\n if (mapping) {\n return new PawapayError(\n message ?? mapping.message,\n mapping.sdkCode,\n mapping.httpStatus,\n {\n retryable: mapping.retryable,\n originalError,\n }\n );\n }\n\n return new PawapayError(\n message ?? 'Unknown error occurred',\n ERROR_CODES.SERVER_ERROR,\n 500,\n {\n retryable: false,\n originalError,\n }\n );\n }\n\n static validation(message: string): PawapayError {\n return new PawapayError(message, ERROR_CODES.VALIDATION_ERROR, 400, {\n retryable: false,\n });\n }\n\n static network(message: string, originalError?: Error): PawapayError {\n return new PawapayError(message, ERROR_CODES.NETWORK_ERROR, 0, {\n retryable: true,\n originalError,\n });\n }\n\n static timeout(message: string = 'Request timed out'): PawapayError {\n return new PawapayError(message, ERROR_CODES.TIMEOUT, 408, {\n retryable: true,\n });\n }\n\n static unauthorized(message: string = 'Invalid or expired API key'): PawapayError {\n return new PawapayError(message, ERROR_CODES.UNAUTHORIZED, 401, {\n retryable: false,\n });\n }\n\n static notFound(message: string = 'Resource not found'): PawapayError {\n return new PawapayError(message, ERROR_CODES.NOT_FOUND, 404, {\n retryable: false,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n failureReason: this.failureReason,\n retryable: this.retryable,\n };\n }\n}\n","import { z } from 'zod';\nimport type { SpaarkPayApiSdkConfig, ResolvedConfig, LogLevel } from './types/config';\nimport { DEFAULT_CONFIG } from './types/config';\nimport { PawapayError } from './core/errors';\n\nconst configSchema = z.object({\n apiKey: z.string().min(1, 'API key is required'),\n environment: z.enum(['sandbox', 'production']),\n baseUrl: z.string().url().optional(),\n callbackUrl: z.string().url().optional(),\n timeout: z.number().positive().max(600000).optional(),\n retries: z.number().int().min(0).max(10).optional(),\n retryDelay: z.number().positive().max(60000).optional(),\n logLevel: z.enum(['debug', 'info', 'warn', 'error', 'none']).optional(),\n});\n\nexport function resolveConfig(config: SpaarkPayApiSdkConfig): ResolvedConfig {\n const result = configSchema.safeParse(config);\n\n if (!result.success) {\n const errors = result.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`);\n throw PawapayError.validation(`Invalid SDK configuration: ${errors.join(', ')}`);\n }\n\n const validated = result.data;\n\n const baseUrl =\n validated.baseUrl ??\n (validated.environment === 'production'\n ? DEFAULT_CONFIG.productionUrl\n : DEFAULT_CONFIG.sandboxUrl);\n\n return {\n apiKey: validated.apiKey,\n environment: validated.environment,\n baseUrl,\n callbackUrl: validated.callbackUrl,\n timeout: validated.timeout ?? DEFAULT_CONFIG.timeout,\n retries: validated.retries ?? DEFAULT_CONFIG.retries,\n retryDelay: validated.retryDelay ?? DEFAULT_CONFIG.retryDelay,\n logLevel: validated.logLevel ?? DEFAULT_CONFIG.logLevel,\n };\n}\n\nexport function getConfigFromEnv(): Partial<SpaarkPayApiSdkConfig> {\n const env = typeof process !== 'undefined' ? process.env : {};\n\n const config: Partial<SpaarkPayApiSdkConfig> = {};\n\n if (env['PAWAPAY_API_KEY']) {\n config.apiKey = env['PAWAPAY_API_KEY'];\n }\n\n if (env['PAWAPAY_ENVIRONMENT']) {\n const envValue = env['PAWAPAY_ENVIRONMENT'].toLowerCase();\n if (envValue === 'production' || envValue === 'sandbox') {\n config.environment = envValue;\n }\n }\n\n if (env['PAWAPAY_BASE_URL']) {\n config.baseUrl = env['PAWAPAY_BASE_URL'];\n }\n\n if (env['PAWAPAY_CALLBACK_URL']) {\n config.callbackUrl = env['PAWAPAY_CALLBACK_URL'];\n }\n\n if (env['PAWAPAY_TIMEOUT']) {\n const timeout = parseInt(env['PAWAPAY_TIMEOUT'], 10);\n if (!isNaN(timeout)) {\n config.timeout = timeout;\n }\n }\n\n if (env['PAWAPAY_RETRIES']) {\n const retries = parseInt(env['PAWAPAY_RETRIES'], 10);\n if (!isNaN(retries)) {\n config.retries = retries;\n }\n }\n\n if (env['PAWAPAY_LOG_LEVEL']) {\n const level = env['PAWAPAY_LOG_LEVEL'].toLowerCase() as LogLevel;\n if (['debug', 'info', 'warn', 'error', 'none'].includes(level)) {\n config.logLevel = level;\n }\n }\n\n return config;\n}\n","import { Logger } from './logger';\nimport { PawapayError } from './errors';\n\nexport interface RetryConfig {\n maxAttempts: number;\n initialDelay: number;\n maxDelay?: number;\n backoffMultiplier?: number;\n}\n\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n maxAttempts: 3,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffMultiplier: 2,\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction calculateDelay(attempt: number, config: Required<RetryConfig>): number {\n const delay = config.initialDelay * Math.pow(config.backoffMultiplier, attempt - 1);\n const jitter = Math.random() * 0.3 * delay;\n return Math.min(delay + jitter, config.maxDelay);\n}\n\nexport async function withRetry<T>(\n operation: () => Promise<T>,\n config: Partial<RetryConfig> = {},\n logger?: Logger\n): Promise<T> {\n const resolvedConfig: Required<RetryConfig> = {\n ...DEFAULT_RETRY_CONFIG,\n ...config,\n };\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= resolvedConfig.maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n const isRetryable =\n error instanceof PawapayError\n ? error.retryable\n : isNetworkError(error);\n\n if (!isRetryable || attempt === resolvedConfig.maxAttempts) {\n throw error;\n }\n\n const delay = calculateDelay(attempt, resolvedConfig);\n\n logger?.warn(\n `Attempt ${attempt}/${resolvedConfig.maxAttempts} failed, retrying in ${Math.round(delay)}ms`,\n { error: lastError.message }\n );\n\n await sleep(delay);\n }\n }\n\n throw lastError ?? new Error('Retry failed without error');\n}\n\nfunction isNetworkError(error: unknown): boolean {\n if (error instanceof PawapayError) {\n return error.retryable;\n }\n\n if (error instanceof Error) {\n const networkErrorMessages = [\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'ETIMEDOUT',\n 'ENOTFOUND',\n 'Network Error',\n 'timeout',\n 'socket hang up',\n ];\n\n return networkErrorMessages.some(\n (msg) =>\n error.message.includes(msg) ||\n (error as NodeJS.ErrnoException).code === msg\n );\n }\n\n return false;\n}\n","import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport axios from 'axios';\nimport type { ResolvedConfig } from '../types/config';\nimport { PawapayError } from './errors';\nimport { Logger } from './logger';\nimport { withRetry } from './retry';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout: number;\n retries: number;\n retryDelay: number;\n logger: Logger;\n}\n\ninterface PawapayErrorResponse {\n errorId?: string;\n errorCode?: string;\n errorMessage?: string;\n rejectionReason?: {\n rejectionCode?: string;\n rejectionMessage?: string;\n };\n}\n\nexport class HttpClient {\n private readonly client: AxiosInstance;\n private readonly logger: Logger;\n private readonly retries: number;\n private readonly retryDelay: number;\n\n constructor(config: HttpClientConfig) {\n this.logger = config.logger;\n this.retries = config.retries;\n this.retryDelay = config.retryDelay;\n\n this.client = axios.create({\n baseURL: config.baseUrl,\n timeout: config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.apiKey}`,\n },\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n this.client.interceptors.request.use(\n (config) => {\n this.logger.debug(`${config.method?.toUpperCase()} ${config.url}`, {\n params: config.params,\n });\n return config;\n },\n (error: unknown) => {\n this.logger.error('Request error', error);\n return Promise.reject(error);\n }\n );\n\n this.client.interceptors.response.use(\n (response) => {\n this.logger.debug(\n `${response.config.method?.toUpperCase()} ${response.config.url} -> ${response.status}`,\n { data: response.data }\n );\n return response;\n },\n (error: unknown) => {\n if (axios.isAxiosError(error)) {\n this.logger.error(\n `Request failed: ${error.config?.method?.toUpperCase()} ${error.config?.url}`,\n {\n status: error.response?.status,\n data: error.response?.data,\n }\n );\n }\n return Promise.reject(error);\n }\n );\n }\n\n private handleError(error: unknown): never {\n if (axios.isAxiosError(error)) {\n if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {\n throw PawapayError.timeout();\n }\n\n if (!error.response) {\n throw PawapayError.network(\n error.message || 'Network error',\n error\n );\n }\n\n const { status, data } = error.response;\n const errorData = data as PawapayErrorResponse | undefined;\n\n if (status === 401) {\n throw PawapayError.unauthorized();\n }\n\n if (status === 404) {\n throw PawapayError.notFound();\n }\n\n const pawapayCode =\n errorData?.errorCode ??\n errorData?.rejectionReason?.rejectionCode;\n\n if (pawapayCode) {\n throw PawapayError.fromPawapayResponse(\n pawapayCode,\n errorData?.errorMessage ?? errorData?.rejectionReason?.rejectionMessage,\n error\n );\n }\n\n throw new PawapayError(\n errorData?.errorMessage ?? `HTTP error ${status}`,\n 'SERVER_ERROR',\n status,\n {\n retryable: status >= 500,\n originalError: error,\n }\n );\n }\n\n if (error instanceof PawapayError) {\n throw error;\n }\n\n throw PawapayError.network(\n error instanceof Error ? error.message : 'Unknown error',\n error instanceof Error ? error : undefined\n );\n }\n\n async get<T>(url: string, config?: AxiosRequestConfig): Promise<T> {\n return withRetry(\n async () => {\n try {\n const response: AxiosResponse<T> = await this.client.get(url, config);\n return response.data;\n } catch (error) {\n this.handleError(error);\n }\n },\n { maxAttempts: this.retries, initialDelay: this.retryDelay },\n this.logger\n );\n }\n\n async post<T, D = unknown>(url: string, data?: D, config?: AxiosRequestConfig): Promise<T> {\n return withRetry(\n async () => {\n try {\n const response: AxiosResponse<T> = await this.client.post(url, data, config);\n return response.data;\n } catch (error) {\n this.handleError(error);\n }\n },\n { maxAttempts: this.retries, initialDelay: this.retryDelay },\n this.logger\n );\n }\n\n async put<T, D = unknown>(url: string, data?: D, config?: AxiosRequestConfig): Promise<T> {\n return withRetry(\n async () => {\n try {\n const response: AxiosResponse<T> = await this.client.put(url, data, config);\n return response.data;\n } catch (error) {\n this.handleError(error);\n }\n },\n { maxAttempts: this.retries, initialDelay: this.retryDelay },\n this.logger\n );\n }\n\n async delete<T>(url: string, config?: AxiosRequestConfig): Promise<T> {\n return withRetry(\n async () => {\n try {\n const response: AxiosResponse<T> = await this.client.delete(url, config);\n return response.data;\n } catch (error) {\n this.handleError(error);\n }\n },\n { maxAttempts: this.retries, initialDelay: this.retryDelay },\n this.logger\n );\n }\n\n static fromConfig(config: ResolvedConfig, logger: Logger): HttpClient {\n return new HttpClient({\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n timeout: config.timeout,\n retries: config.retries,\n retryDelay: config.retryDelay,\n logger,\n });\n }\n}\n","import type { LogLevel } from '../types/config';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nexport class Logger {\n private readonly prefix: string;\n private level: LogLevel;\n\n constructor(prefix: string, level: LogLevel = 'info') {\n this.prefix = prefix;\n this.level = level;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n private shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\n }\n\n private formatMessage(level: string, message: string): string {\n const timestamp = new Date().toISOString();\n return `[${timestamp}] ${level.toUpperCase().padEnd(5)} [${this.prefix}] ${message}`;\n }\n\n private sanitize(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (typeof data === 'string') {\n return data;\n }\n\n if (typeof data !== 'object') {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map((item) => this.sanitize(item));\n }\n\n const sanitized: Record<string, unknown> = {};\n const sensitiveKeys = ['apiKey', 'api_key', 'authorization', 'password', 'secret', 'token'];\n\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n if (sensitiveKeys.some((sk) => key.toLowerCase().includes(sk))) {\n sanitized[key] = '[REDACTED]';\n } else if (typeof value === 'object' && value !== null) {\n sanitized[key] = this.sanitize(value);\n } else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n }\n\n debug(message: string, data?: unknown): void {\n if (this.shouldLog('debug')) {\n const formatted = this.formatMessage('debug', message);\n if (data !== undefined) {\n console.debug(formatted, this.sanitize(data));\n } else {\n console.debug(formatted);\n }\n }\n }\n\n info(message: string, data?: unknown): void {\n if (this.shouldLog('info')) {\n const formatted = this.formatMessage('info', message);\n if (data !== undefined) {\n console.info(formatted, this.sanitize(data));\n } else {\n console.info(formatted);\n }\n }\n }\n\n warn(message: string, data?: unknown): void {\n if (this.shouldLog('warn')) {\n const formatted = this.formatMessage('warn', message);\n if (data !== undefined) {\n console.warn(formatted, this.sanitize(data));\n } else {\n console.warn(formatted);\n }\n }\n }\n\n error(message: string, error?: Error | unknown): void {\n if (this.shouldLog('error')) {\n const formatted = this.formatMessage('error', message);\n if (error !== undefined) {\n console.error(formatted, this.sanitize(error));\n } else {\n console.error(formatted);\n }\n }\n }\n}\n","export type Correspondent =\n | 'MTN_MOMO_CMR'\n | 'ORANGE_CMR'\n | 'MTN_MOMO_COG'\n | 'AIRTEL_COG'\n | 'MTN_MOMO_GAB'\n | 'AIRTEL_GAB';\n\nexport const CORRESPONDENTS = [\n 'MTN_MOMO_CMR',\n 'ORANGE_CMR',\n 'MTN_MOMO_COG',\n 'AIRTEL_COG',\n 'MTN_MOMO_GAB',\n 'AIRTEL_GAB',\n] as const;\n\nexport type CorrespondentFeature = 'deposit' | 'payout' | 'refund';\n\nexport interface CorrespondentInfo {\n correspondent: Correspondent;\n name: string;\n country: string;\n countryCode: string;\n currency: string;\n features: CorrespondentFeature[];\n phoneRegex: RegExp;\n}\n\nexport const CORRESPONDENT_INFO: Record<Correspondent, CorrespondentInfo> = {\n MTN_MOMO_CMR: {\n correspondent: 'MTN_MOMO_CMR',\n name: 'MTN Mobile Money',\n country: 'Cameroon',\n countryCode: 'CMR',\n currency: 'XAF',\n features: ['deposit', 'payout', 'refund'],\n phoneRegex: /^237(67|68|65[0-4])\\d{6}$/,\n },\n ORANGE_CMR: {\n correspondent: 'ORANGE_CMR',\n name: 'Orange Money',\n country: 'Cameroon',\n countryCode: 'CMR',\n currency: 'XAF',\n features: ['deposit', 'payout', 'refund'],\n phoneRegex: /^237(69|65[5-9])\\d{6}$/,\n },\n MTN_MOMO_COG: {\n correspondent: 'MTN_MOMO_COG',\n name: 'MTN Mobile Money',\n country: 'Congo',\n countryCode: 'COG',\n currency: 'XAF',\n features: ['deposit', 'payout', 'refund'],\n phoneRegex: /^242(04|05|06)\\d{7}$/,\n },\n AIRTEL_COG: {\n correspondent: 'AIRTEL_COG',\n name: 'Airtel Money',\n country: 'Congo',\n countryCode: 'COG',\n currency: 'XAF',\n features: ['deposit', 'payout'],\n phoneRegex: /^242(01|02|03)\\d{7}$/,\n },\n MTN_MOMO_GAB: {\n correspondent: 'MTN_MOMO_GAB',\n name: 'MTN Mobile Money',\n country: 'Gabon',\n countryCode: 'GAB',\n currency: 'XAF',\n features: ['deposit', 'payout', 'refund'],\n phoneRegex: /^241(06|07)\\d{6}$/,\n },\n AIRTEL_GAB: {\n correspondent: 'AIRTEL_GAB',\n name: 'Airtel Money',\n country: 'Gabon',\n countryCode: 'GAB',\n currency: 'XAF',\n features: ['deposit', 'payout'],\n phoneRegex: /^241(04|05)\\d{6}$/,\n },\n};\n\nexport interface TransactionLimits {\n minDeposit: number;\n maxDeposit: number;\n minPayout: number;\n maxPayout: number;\n currency: string;\n dailyLimit?: number;\n monthlyLimit?: number;\n}\n\nexport const DEFAULT_LIMITS: Record<Correspondent, TransactionLimits> = {\n MTN_MOMO_CMR: {\n minDeposit: 100,\n maxDeposit: 1_000_000,\n minPayout: 500,\n maxPayout: 500_000,\n currency: 'XAF',\n dailyLimit: 2_000_000,\n },\n ORANGE_CMR: {\n minDeposit: 100,\n maxDeposit: 1_000_000,\n minPayout: 500,\n maxPayout: 500_000,\n currency: 'XAF',\n dailyLimit: 2_000_000,\n },\n MTN_MOMO_COG: {\n minDeposit: 100,\n maxDeposit: 500_000,\n minPayout: 500,\n maxPayout: 300_000,\n currency: 'XAF',\n dailyLimit: 1_000_000,\n },\n AIRTEL_COG: {\n minDeposit: 100,\n maxDeposit: 500_000,\n minPayout: 500,\n maxPayout: 300_000,\n currency: 'XAF',\n dailyLimit: 1_000_000,\n },\n MTN_MOMO_GAB: {\n minDeposit: 100,\n maxDeposit: 500_000,\n minPayout: 500,\n maxPayout: 300_000,\n currency: 'XAF',\n dailyLimit: 1_000_000,\n },\n AIRTEL_GAB: {\n minDeposit: 100,\n maxDeposit: 500_000,\n minPayout: 500,\n maxPayout: 300_000,\n currency: 'XAF',\n dailyLimit: 1_000_000,\n },\n};\n","import { z } from 'zod';\nimport { CORRESPONDENTS } from '../constants/correspondents';\nimport type { HttpClient } from '../core/http-client';\nimport type { Logger } from '../core/logger';\nimport { PawapayError } from '../core/errors';\nimport type {\n DepositRequest,\n DepositResponse,\n PayoutRequest,\n PayoutResponse,\n RefundRequest,\n RefundResponse,\n TransactionStatusResponse,\n TransactionStatus,\n PollOptions,\n TransactionFilters,\n PaymentPageRequest,\n PaymentPageResponse,\n ActionResponse,\n} from '../types/transactions';\n\n// V2 API validation schemas\nconst depositRequestSchema = z.object({\n amount: z.number().positive('Amount must be positive').max(10_000_000),\n currency: z.string().min(3).max(3),\n provider: z.enum(CORRESPONDENTS),\n phoneNumber: z.string().regex(/^[0-9]{9,15}$/, 'Phone number must be 9-15 digits'),\n transactionId: z.string().uuid(),\n preAuthorisationCode: z.string().optional(),\n clientReferenceId: z.string().optional(),\n customerMessage: z.string().min(4).max(22).optional(),\n metadata: z.array(z.record(z.unknown())).max(10).optional(),\n});\n\nconst payoutRequestSchema = z.object({\n amount: z.number().positive('Amount must be positive').max(10_000_000),\n currency: z.string().min(3).max(3),\n provider: z.enum(CORRESPONDENTS),\n phoneNumber: z.string().regex(/^[0-9]{9,15}$/, 'Phone number must be 9-15 digits'),\n transactionId: z.string().uuid(),\n clientReferenceId: z.string().optional(),\n customerMessage: z.string().min(4).max(22).optional(),\n metadata: z.array(z.record(z.unknown())).max(10).optional(),\n});\n\nconst paymentPageRequestSchema = z.object({\n depositId: z.string().uuid(),\n returnUrl: z.string().url(),\n phoneNumber: z.string().optional(),\n amountDetails: z.object({\n amount: z.number().positive(),\n currency: z.string().length(3),\n }).optional(),\n language: z.enum(['EN', 'FR']).optional(),\n country: z.string().length(3).optional(),\n reason: z.string().max(50).optional(),\n customerMessage: z.string().min(4).max(22).optional(),\n metadata: z.array(z.record(z.unknown())).max(10).optional(),\n});\n\nconst refundRequestSchema = z.object({\n depositId: z.string().uuid(),\n amount: z.number().positive('Amount must be positive'),\n transactionId: z.string().uuid(),\n});\n\n// V2 Pawapay API request/response interfaces\ninterface PawapayV2DepositRequest {\n depositId: string;\n amount: string;\n currency: string;\n payer: {\n type: 'MMO';\n accountDetails: {\n phoneNumber: string;\n provider: string;\n };\n };\n preAuthorisationCode?: string;\n clientReferenceId?: string;\n customerMessage?: string;\n metadata?: Array<Record<string, unknown>>;\n}\n\ninterface PawapayV2PayoutRequest {\n payoutId: string;\n amount: string;\n currency: string;\n recipient: {\n type: 'MMO';\n accountDetails: {\n phoneNumber: string;\n provider: string;\n };\n };\n clientReferenceId?: string;\n customerMessage?: string;\n metadata?: Array<Record<string, unknown>>;\n}\n\ninterface PawapayV2PaymentPageRequest {\n depositId: string;\n returnUrl: string;\n phoneNumber?: string;\n amountDetails?: {\n amount: string;\n currency: string;\n };\n language?: 'EN' | 'FR';\n country?: string;\n reason?: string;\n customerMessage?: string;\n metadata?: Array<Record<string, unknown>>;\n}\n\ninterface PawapayV2DepositResponse {\n depositId: string;\n status: string;\n created?: string;\n nextStep?: string;\n redirectUrl?: string;\n rejectionReason?: {\n rejectionCode: string;\n rejectionMessage: string;\n };\n}\n\ninterface PawapayV2PayoutResponse {\n payoutId: string;\n status: string;\n created?: string;\n rejectionReason?: {\n rejectionCode: string;\n rejectionMessage: string;\n };\n}\n\ninterface PawapayV2PaymentPageResponse {\n redirectUrl: string;\n}\n\ninterface PawapayRefundRequest {\n refundId: string;\n depositId: string;\n amount?: string;\n}\n\ninterface PawapayRefundResponse {\n refundId: string;\n status: string;\n created?: string;\n rejectionReason?: {\n rejectionCode: string;\n rejectionMessage: string;\n };\n}\n\n// V2 Status check response wrapper\ninterface PawapayV2StatusWrapper {\n status: 'FOUND' | 'NOT_FOUND';\n data?: PawapayV2StatusData;\n}\n\ninterface PawapayV2StatusData {\n depositId?: string;\n payoutId?: string;\n status: string;\n amount: string;\n currency: string;\n country: string;\n created: string;\n customerMessage?: string;\n clientReferenceId?: string;\n providerTransactionId?: string;\n payer?: {\n type: 'MMO';\n accountDetails: {\n phoneNumber: string;\n provider: string;\n };\n };\n recipient?: {\n type: 'MMO';\n accountDetails: {\n phoneNumber: string;\n provider: string;\n };\n };\n failureReason?: {\n failureCode: string;\n failureMessage?: string;\n };\n metadata?: Record<string, string>;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class TransactionsModule {\n constructor(\n private readonly httpClient: HttpClient,\n private readonly logger: Logger\n ) {}\n\n /**\n * Initiate a deposit (collect payment from mobile money user) - V2 API\n */\n async initiateDeposit(request: DepositRequest): Promise<DepositResponse> {\n const validated = depositRequestSchema.parse(request);\n\n const pawapayRequest: PawapayV2DepositRequest = {\n depositId: validated.transactionId,\n amount: validated.amount.toString(),\n currency: validated.currency,\n payer: {\n type: 'MMO',\n accountDetails: {\n phoneNumber: validated.phoneNumber,\n provider: validated.provider,\n },\n },\n preAuthorisationCode: validated.preAuthorisationCode,\n clientReferenceId: validated.clientReferenceId,\n customerMessage: validated.customerMessage,\n metadata: validated.metadata,\n };\n\n this.logger.info(`Initiating V2 deposit ${validated.transactionId}`, {\n amount: validated.amount,\n currency: validated.currency,\n provider: validated.provider,\n });\n\n const response = await this.httpClient.post<PawapayV2DepositResponse>(\n '/v2/deposits',\n pawapayRequest\n );\n\n if (response.status === 'REJECTED' && response.rejectionReason) {\n throw PawapayError.fromPawapayResponse(\n response.rejectionReason.rejectionCode,\n response.rejectionReason.rejectionMessage\n );\n }\n\n this.logger.info(`Deposit ${response.depositId} status: ${response.status}`);\n\n return {\n depositId: response.depositId,\n status: response.status as TransactionStatus,\n created: response.created ?? new Date().toISOString(),\n nextStep: response.nextStep as DepositResponse['nextStep'],\n redirectUrl: response.redirectUrl,\n };\n }\n\n /**\n * Initiate a payout (send money to mobile money user) - V2 API\n */\n async initiatePayout(request: PayoutRequest): Promise<PayoutResponse> {\n const validated = payoutRequestSchema.parse(request);\n\n const pawapayRequest: PawapayV2PayoutRequest = {\n payoutId: validated.transactionId,\n amount: validated.amount.toString(),\n currency: validated.currency,\n recipient: {\n type: 'MMO',\n accountDetails: {\n phoneNumber: validated.phoneNumber,\n provider: validated.provider,\n },\n },\n clientReferenceId: validated.clientReferenceId,\n customerMessage: validated.customerMessage,\n metadata: validated.metadata,\n };\n\n this.logger.info(`Initiating V2 payout ${validated.transactionId}`, {\n amount: validated.amount,\n currency: validated.currency,\n provider: validated.provider,\n });\n\n const response = await this.httpClient.post<PawapayV2PayoutResponse>(\n '/v2/payouts',\n pawapayRequest\n );\n\n if (response.status === 'REJECTED' && response.rejectionReason) {\n throw PawapayError.fromPawapayResponse(\n response.rejectionReason.rejectionCode,\n response.rejectionReason.rejectionMessage\n );\n }\n\n this.logger.info(`Payout ${response.payoutId} status: ${response.status}`);\n\n return {\n payoutId: response.payoutId,\n status: response.status as TransactionStatus,\n created: response.created ?? new Date().toISOString(),\n };\n }\n\n /**\n * Create a hosted payment page - V2 API\n */\n async createPaymentPage(request: PaymentPageRequest): Promise<PaymentPageResponse> {\n const validated = paymentPageRequestSchema.parse(request);\n\n const pawapayRequest: PawapayV2PaymentPageRequest = {\n depositId: validated.depositId,\n returnUrl: validated.returnUrl,\n phoneNumber: validated.phoneNumber,\n amountDetails: validated.amountDetails\n ? {\n amount: validated.amountDetails.amount.toString(),\n currency: validated.amountDetails.currency,\n }\n : undefined,\n language: validated.language,\n country: validated.country,\n reason: validated.reason,\n customerMessage: validated.customerMessage,\n metadata: validated.metadata,\n };\n\n this.logger.info(`Creating payment page for deposit ${validated.depositId}`);\n\n const response = await this.httpClient.post<PawapayV2PaymentPageResponse>(\n '/v2/paymentpage',\n pawapayRequest\n );\n\n this.logger.info(`Payment page created: ${response.redirectUrl}`);\n\n return {\n redirectUrl: response.redirectUrl,\n };\n }\n\n /**\n * Refund a deposit\n */\n async refund(request: RefundRequest): Promise<RefundResponse> {\n const validated = refundRequestSchema.parse(request);\n\n const pawapayRequest: PawapayRefundRequest = {\n refundId: validated.transactionId,\n depositId: validated.depositId,\n amount: validated.amount.toString(),\n };\n\n this.logger.info(`Initiating refund ${validated.transactionId}`, {\n depositId: validated.depositId,\n amount: validated.amount,\n });\n\n const response = await this.httpClient.post<PawapayRefundResponse>(\n '/refunds',\n pawapayRequest\n );\n\n if (response.status === 'REJECTED' && response.rejectionReason) {\n throw PawapayError.fromPawapayResponse(\n response.rejectionReason.rejectionCode,\n response.rejectionReason.rejectionMessage\n );\n }\n\n this.logger.info(`Refund ${response.refundId} status: ${response.status}`);\n\n return {\n refundId: response.refundId,\n depositId: validated.depositId,\n status: response.status as TransactionStatus,\n amount: validated.amount,\n created: response.created ?? new Date().toISOString(),\n };\n }\n\n /**\n * Check deposit status - V2 API\n */\n async checkDepositStatus(depositId: string): Promise<TransactionStatusResponse> {\n if (!z.string().uuid().safeParse(depositId).success) {\n throw PawapayError.validation('Invalid deposit ID format');\n }\n\n const response = await this.httpClient.get<PawapayV2StatusWrapper>(\n `/v2/deposits/${depositId}`\n );\n\n if (response.status === 'NOT_FOUND' || !response.data) {\n throw PawapayError.notFound(`Deposit ${depositId} not found`);\n }\n\n const data = response.data;\n return {\n depositId: data.depositId,\n status: data.status as TransactionStatus,\n amount: data.amount,\n currency: data.currency,\n country: data.country,\n payer: data.payer as TransactionStatusResponse['payer'],\n created: data.created,\n customerMessage: data.customerMessage,\n clientReferenceId: data.clientReferenceId,\n providerTransactionId: data.providerTransactionId,\n failureReason: data.failureReason as TransactionStatusResponse['failureReason'],\n metadata: data.metadata,\n };\n }\n\n /**\n * Check payout status - V2 API\n */\n async checkPayoutStatus(payoutId: string): Promise<TransactionStatusResponse> {\n if (!z.string().uuid().safeParse(payoutId).success) {\n throw PawapayError.validation('Invalid payout ID format');\n }\n\n const response = await this.httpClient.get<PawapayV2StatusWrapper>(\n `/v2/payouts/${payoutId}`\n );\n\n if (response.status === 'NOT_FOUND' || !response.data) {\n throw PawapayError.notFound(`Payout ${payoutId} not found`);\n }\n\n const data = response.data;\n return {\n payoutId: data.payoutId,\n status: data.status as TransactionStatus,\n amount: data.amount,\n currency: data.currency,\n country: data.country,\n recipient: data.recipient as TransactionStatusResponse['recipient'],\n created: data.created,\n customerMessage: data.customerMessage,\n clientReferenceId: data.clientReferenceId,\n providerTransactionId: data.providerTransactionId,\n failureReason: data.failureReason as TransactionStatusResponse['failureReason'],\n metadata: data.metadata,\n };\n }\n\n /**\n * Check transaction status (tries deposit first, then payout) - V2 API\n */\n async checkStatus(transactionId: string): Promise<TransactionStatusResponse> {\n // Try deposit first\n try {\n return await this.checkDepositStatus(transactionId);\n } catch (err) {\n // If not found as deposit, try payout\n if (err instanceof PawapayError && err.code === 'NOT_FOUND') {\n return await this.checkPayoutStatus(transactionId);\n }\n throw err;\n }\n }\n\n /**\n * Poll until transaction reaches final status\n */\n async pollUntilComplete(\n transactionId: string,\n options: PollOptions = {}\n ): Promise<TransactionStatusResponse> {\n const {\n interval = 5000,\n maxAttempts = 12,\n onStatusChange,\n } = options;\n\n let lastStatus: TransactionStatus | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const status = await this.checkStatus(transactionId);\n\n if (status.status !== lastStatus) {\n lastStatus = status.status;\n onStatusChange?.(status.status);\n }\n\n if (status.status === 'COMPLETED' || status.status === 'FAILED') {\n return status;\n }\n\n if (attempt < maxAttempts) {\n await sleep(interval);\n }\n }\n\n const finalStatus = await this.checkStatus(transactionId);\n return finalStatus;\n }\n\n /**\n * List deposits with filters\n */\n async listDeposits(filters?: TransactionFilters): Promise<DepositResponse[]> {\n const params: Record<string, string> = {};\n\n if (filters?.from) params.from = filters.from;\n if (filters?.to) params.to = filters.to;\n if (filters?.status) params.status = filters.status;\n if (filters?.provider) params.provider = filters.provider;\n if (filters?.limit) params.limit = String(filters.limit);\n if (filters?.offset) params.offset = String(filters.offset);\n\n const response = await this.httpClient.get<PawapayV2StatusData[]>('/v2/deposits', {\n params,\n });\n\n return response.map((deposit): DepositResponse => ({\n depositId: deposit.depositId ?? '',\n status: deposit.status as TransactionStatus,\n created: deposit.created,\n }));\n }\n\n /**\n * List payouts with filters\n */\n async listPayouts(filters?: TransactionFilters): Promise<PayoutResponse[]> {\n const params: Record<string, string> = {};\n\n if (filters?.from) params.from = filters.from;\n if (filters?.to) params.to = filters.to;\n if (filters?.status) params.status = filters.status;\n if (filters?.provider) params.provider = filters.provider;\n if (filters?.limit) params.limit = String(filters.limit);\n if (filters?.offset) params.offset = String(filters.offset);\n\n const response = await this.httpClient.get<PawapayV2StatusData[]>('/v2/payouts', {\n params,\n });\n\n return response.map((payout): PayoutResponse => ({\n payoutId: payout.payoutId ?? '',\n status: payout.status as TransactionStatus,\n created: payout.created,\n }));\n }\n\n /**\n * Resend deposit callback - V2 API\n * Triggers a new callback for a deposit transaction\n */\n async resendDepositCallback(depositId: string): Promise<ActionResponse> {\n if (!z.string().uuid().safeParse(depositId).success) {\n throw PawapayError.validation('Invalid deposit ID format');\n }\n\n this.logger.info(`Resending callback for deposit ${depositId}`);\n\n const response = await this.httpClient.post<ActionResponse>(\n `/v2/deposits/${depositId}/resend-callback`,\n {}\n );\n\n this.logger.info(`Resend callback for deposit ${depositId}: ${response.status}`);\n\n return response;\n }\n\n /**\n * Resend payout callback - V2 API\n * Triggers a new callback for a payout transaction\n */\n async resendPayoutCallback(payoutId: string): Promise<ActionResponse> {\n if (!z.string().uuid().safeParse(payoutId).success) {\n throw PawapayError.validation('Invalid payout ID format');\n }\n\n this.logger.info(`Resending callback for payout ${payoutId}`);\n\n const response = await this.httpClient.post<ActionResponse>(\n `/v2/payouts/${payoutId}/resend-callback`,\n {}\n );\n\n this.logger.info(`Resend callback for payout ${payoutId}: ${response.status}`);\n\n return response;\n }\n\n /**\n * Cancel enqueued payout - V2 API\n * Cancels a payout that is still in ENQUEUED status\n */\n async cancelEnqueuedPayout(payoutId: string): Promise<ActionResponse> {\n if (!z.string().uuid().safeParse(payoutId).success) {\n throw PawapayError.validation('Invalid payout ID format');\n }\n\n this.logger.info(`Cancelling enqueued payout ${payoutId}`);\n\n const response = await this.httpClient.post<ActionResponse>(\n `/v2/payouts/${payoutId}/cancel`,\n {}\n );\n\n this.logger.info(`Cancel payout ${payoutId}: ${response.status}`);\n\n return response;\n }\n}\n","import { z } from 'zod';\nimport type { Logger } from '../core/logger';\nimport { PawapayError } from '../core/errors';\nimport type {\n Product,\n ProductCreateRequest,\n DomainAddRequest,\n} from '../types/products';\n\nconst productCreateSchema = z.object({\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n price: z.number().positive(),\n currency: z.enum(['XAF', 'XOF', 'USD']),\n metadata: z.record(z.unknown()).optional(),\n});\n\nconst domainAddSchema = z.object({\n productId: z.string().uuid(),\n domain: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]?\\.[a-zA-Z]{2,}$/),\n});\n\ninterface StoredProduct extends Product {\n metadata?: Record<string, unknown>;\n}\n\nexport class ProductsModule {\n private products: Map<string, StoredProduct> = new Map();\n\n constructor(private readonly logger: Logger) {}\n\n async create(request: ProductCreateRequest): Promise<Product> {\n const validated = productCreateSchema.parse(request);\n\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const product: StoredProduct = {\n id,\n name: validated.name,\n description: validated.description,\n price: validated.price,\n currency: validated.currency,\n domains: [],\n created: now,\n updated: now,\n metadata: validated.metadata,\n };\n\n this.products.set(id, product);\n\n this.logger.info(`Created product ${id}`, { name: validated.name });\n\n return this.toProduct(product);\n }\n\n async get(productId: string): Promise<Product> {\n const product = this.products.get(productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${productId} not found`);\n }\n\n return this.toProduct(product);\n }\n\n async list(): Promise<Product[]> {\n return Array.from(this.products.values()).map((p) => this.toProduct(p));\n }\n\n async update(\n productId: string,\n updates: Partial<ProductCreateRequest>\n ): Promise<Product> {\n const product = this.products.get(productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${productId} not found`);\n }\n\n const validated = productCreateSchema.partial().parse(updates);\n\n const updatedProduct: StoredProduct = {\n ...product,\n ...validated,\n updated: new Date().toISOString(),\n };\n\n this.products.set(productId, updatedProduct);\n\n this.logger.info(`Updated product ${productId}`);\n\n return this.toProduct(updatedProduct);\n }\n\n async delete(productId: string): Promise<void> {\n const product = this.products.get(productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${productId} not found`);\n }\n\n this.products.delete(productId);\n\n this.logger.info(`Deleted product ${productId}`);\n }\n\n async addDomain(request: DomainAddRequest): Promise<Product> {\n const validated = domainAddSchema.parse(request);\n\n const product = this.products.get(validated.productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${validated.productId} not found`);\n }\n\n if (product.domains.includes(validated.domain)) {\n throw PawapayError.validation(`Domain ${validated.domain} already added to product`);\n }\n\n product.domains.push(validated.domain);\n product.updated = new Date().toISOString();\n\n this.logger.info(`Added domain ${validated.domain} to product ${validated.productId}`);\n\n return this.toProduct(product);\n }\n\n async removeDomain(productId: string, domain: string): Promise<Product> {\n const product = this.products.get(productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${productId} not found`);\n }\n\n const domainIndex = product.domains.indexOf(domain);\n\n if (domainIndex === -1) {\n throw PawapayError.notFound(`Domain ${domain} not found in product`);\n }\n\n product.domains.splice(domainIndex, 1);\n product.updated = new Date().toISOString();\n\n this.logger.info(`Removed domain ${domain} from product ${productId}`);\n\n return this.toProduct(product);\n }\n\n private toProduct(stored: StoredProduct): Product {\n return {\n id: stored.id,\n name: stored.name,\n description: stored.description,\n price: stored.price,\n currency: stored.currency,\n domains: [...stored.domains],\n created: stored.created,\n updated: stored.updated,\n };\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto';\nimport type { HttpClient } from '../core/http-client';\nimport type { Logger } from '../core/logger';\nimport { PawapayError } from '../core/errors';\nimport type { PawapayWebhookEvent, WebhookEventType } from '../types/webhooks';\n\nexport interface WebhooksConfig {\n webhookSecret?: string;\n}\n\nexport class WebhooksModule {\n private webhookSecret?: string;\n\n constructor(\n private readonly httpClient: HttpClient,\n private readonly logger: Logger,\n config?: WebhooksConfig\n ) {\n this.webhookSecret = config?.webhookSecret;\n }\n\n setWebhookSecret(secret: string): void {\n this.webhookSecret = secret;\n }\n\n verifySignature(payload: string, signature: string): boolean {\n if (!this.webhookSecret) {\n this.logger.warn('Webhook secret not configured, skipping signature verification');\n return true;\n }\n\n if (!signature) {\n this.logger.warn('No signature provided in webhook request');\n return false;\n }\n\n try {\n const expectedSignature = createHmac('sha256', this.webhookSecret)\n .update(payload, 'utf8')\n .digest('hex');\n\n const signatureBuffer = Buffer.from(signature, 'hex');\n const expectedBuffer = Buffer.from(expectedSignature, 'hex');\n\n if (signatureBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return timingSafeEqual(signatureBuffer, expectedBuffer);\n } catch (error) {\n this.logger.error('Error verifying webhook signature', error);\n return false;\n }\n }\n\n parseEvent<T = unknown>(payload: string): PawapayWebhookEvent<T> {\n try {\n const event = JSON.parse(payload) as PawapayWebhookEvent<T>;\n\n if (!event.eventId || !event.eventType || !event.timestamp) {\n throw new Error('Invalid webhook event structure');\n }\n\n return event;\n } catch (error) {\n throw PawapayError.validation(\n `Failed to parse webhook event: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n constructEvent<T = unknown>(\n payload: string,\n signature: string\n ): PawapayWebhookEvent<T> {\n if (!this.verifySignature(payload, signature)) {\n throw PawapayError.unauthorized('Invalid webhook signature');\n }\n\n return this.parseEvent<T>(payload);\n }\n\n async registerCallback(url: string): Promise<void> {\n this.logger.info(`Registering callback URL: ${url}`);\n\n await this.httpClient.post('/webhooks', { url });\n\n this.logger.info('Callback URL registered successfully');\n }\n\n async unregisterCallback(): Promise<void> {\n this.logger.info('Unregistering callback URL');\n\n await this.httpClient.delete('/webhooks');\n\n this.logger.info('Callback URL unregistered successfully');\n }\n\n isDepositEvent(eventType: WebhookEventType): boolean {\n return eventType.startsWith('deposit.');\n }\n\n isPayoutEvent(eventType: WebhookEventType): boolean {\n return eventType.startsWith('payout.');\n }\n\n isRefundEvent(eventType: WebhookEventType): boolean {\n return eventType.startsWith('refund.');\n }\n\n isSuccessEvent(eventType: WebhookEventType): boolean {\n return eventType.endsWith('.completed');\n }\n\n isFailureEvent(eventType: WebhookEventType): boolean {\n return eventType.endsWith('.failed');\n }\n}\n","import { v4 as uuidv4, validate as uuidValidate, version as uuidVersion } from 'uuid';\nimport {\n CORRESPONDENTS,\n CORRESPONDENT_INFO,\n DEFAULT_LIMITS,\n type Correspondent,\n type CorrespondentInfo,\n type TransactionLimits,\n} from '../constants/correspondents';\nimport type { HttpClient } from '../core/http-client';\nimport type { Logger } from '../core/logger';\nimport type {\n CountryAvailability,\n PredictProviderResponse,\n ActiveConfigResponse,\n PublicKeyResponse,\n OperationType,\n} from '../types/toolkit';\n\nexport interface MMOAvailability {\n correspondent: Correspondent;\n available: boolean;\n degraded: boolean;\n estimatedRecovery?: string;\n message?: string;\n}\n\nexport class UtilsModule {\n constructor(\n private readonly httpClient: HttpClient,\n private readonly logger: Logger\n ) {}\n\n generateTransactionId(): string {\n return uuidv4();\n }\n\n validateTransactionId(id: string): boolean {\n return uuidValidate(id) && uuidVersion(id) === 4;\n }\n\n /**\n * Get active configuration - V2 API\n * Returns your account configuration including countries, providers, and limits\n */\n async getActiveConfiguration(options?: {\n country?: string;\n operationType?: OperationType;\n }): Promise<ActiveConfigResponse> {\n const params: Record<string, string> = {};\n if (options?.country) params.country = options.country;\n if (options?.operationType) params.operationType = options.operationType;\n\n this.logger.info('Fetching active configuration', options);\n\n const response = await this.httpClient.get<ActiveConfigResponse>('/v2/active-conf', {\n params: Object.keys(params).length > 0 ? params : undefined,\n });\n\n this.logger.info(`Retrieved configuration for ${response.countries.length} countries`);\n\n return response;\n }\n\n /**\n * Get provider availability - V2 API\n * Returns current processing status for all providers\n */\n async getProviderAvailability(options?: {\n country?: string;\n operationType?: OperationType;\n }): Promise<CountryAvailability[]> {\n const params: Record<string, string> = {};\n if (options?.country) params.country = options.country;\n if (options?.operationType) params.operationType = options.operationType;\n\n this.logger.info('Fetching provider availability', options);\n\n const response = await this.httpClient.get<CountryAvailability[]>('/v2/availability', {\n params: Object.keys(params).length > 0 ? params : undefined,\n });\n\n return response;\n }\n\n /**\n * Predict provider from phone number - V2 API\n * Returns the predicted provider and sanitized phone number\n */\n async predictProvider(phoneNumber: string): Promise<PredictProviderResponse> {\n this.logger.info('Predicting provider for phone number');\n\n const response = await this.httpClient.post<PredictProviderResponse>(\n '/v2/predict-provider',\n { phoneNumber }\n );\n\n this.logger.info(`Predicted provider: ${response.provider} (${response.country})`);\n\n return response;\n }\n\n /**\n * Get public keys for callback verification - V2 API\n */\n async getPublicKeys(): Promise<PublicKeyResponse[]> {\n this.logger.info('Fetching public keys');\n\n const response = await this.httpClient.get<PublicKeyResponse[]>('/v2/public-key/http');\n\n this.logger.info(`Retrieved ${response.length} public keys`);\n\n return response;\n }\n\n async getTransactionLimits(correspondent: Correspondent): Promise<TransactionLimits> {\n try {\n const config = await this.getActiveConfiguration();\n\n for (const country of config.countries) {\n for (const provider of country.providers) {\n if (provider.provider === correspondent) {\n const currency = provider.currencies[0];\n if (currency?.operationTypes) {\n const deposit = currency.operationTypes.DEPOSIT;\n const payout = currency.operationTypes.PAYOUT;\n const defaults = DEFAULT_LIMITS[correspondent];\n\n return {\n minDeposit: deposit?.minAmount ? parseFloat(deposit.minAmount) : defaults.minDeposit,\n maxDeposit: deposit?.maxAmount ? parseFloat(deposit.maxAmount) : defaults.maxDeposit,\n minPayout: payout?.minAmount ? parseFloat(payout.minAmount) : defaults.minPayout,\n maxPayout: payout?.maxAmount ? parseFloat(payout.maxAmount) : defaults.maxPayout,\n currency: currency.currency,\n dailyLimit: defaults.dailyLimit,\n };\n }\n }\n }\n }\n } catch (error) {\n this.logger.warn(`Failed to fetch live limits for ${correspondent}, using defaults`, error);\n }\n\n return DEFAULT_LIMITS[correspondent];\n }\n\n async checkMMOAvailability(correspondent: Correspondent): Promise<MMOAvailability> {\n try {\n const availability = await this.getProviderAvailability();\n\n for (const country of availability) {\n const provider = country.providers.find((p) => p.provider === correspondent);\n if (provider) {\n const depositStatus = provider.operationTypes.find((op) => op.operationType === 'DEPOSIT');\n const payoutStatus = provider.operationTypes.find((op) => op.operationType === 'PAYOUT');\n\n const isOperational =\n depositStatus?.status === 'OPERATIONAL' ||\n payoutStatus?.status === 'OPERATIONAL';\n const isDelayed =\n depositStatus?.status === 'DELAYED' ||\n payoutStatus?.status === 'DELAYED';\n const isClosed =\n depositStatus?.status === 'CLOSED' &&\n payoutStatus?.status === 'CLOSED';\n\n return {\n correspondent,\n available: isOperational || isDelayed,\n degraded: isDelayed,\n message: isClosed ? 'Provider is currently closed' : undefined,\n };\n }\n }\n\n return {\n correspondent,\n available: false,\n degraded: false,\n message: 'Correspondent not found in availability list',\n };\n } catch (error) {\n this.logger.warn(`Failed to check MMO availability for ${correspondent}`, error);\n\n return {\n correspondent,\n available: false,\n degraded: true,\n message: 'Unable to verify availability',\n };\n }\n }\n\n formatPhoneNumber(phone: string, countryCode: string): string {\n let cleaned = phone.replace(/\\D/g, '');\n\n if (cleaned.startsWith('00')) {\n cleaned = cleaned.slice(2);\n }\n\n const countryPrefixes: Record<string, string> = {\n CMR: '237',\n COG: '242',\n GAB: '241',\n ZMB: '260',\n GHA: '233',\n KEN: '254',\n TZA: '255',\n UGA: '256',\n RWA: '250',\n BEN: '229',\n CIV: '225',\n SEN: '221',\n };\n\n const prefix = countryPrefixes[countryCode.toUpperCase()];\n\n if (prefix && !cleaned.startsWith(prefix)) {\n if (cleaned.startsWith('0')) {\n cleaned = cleaned.slice(1);\n }\n cleaned = prefix + cleaned;\n }\n\n return cleaned;\n }\n\n validatePhoneNumber(phone: string, correspondent: Correspondent): boolean {\n const info = CORRESPONDENT_INFO[correspondent];\n if (!info) {\n return false;\n }\n\n const cleaned = phone.replace(/\\D/g, '');\n return info.phoneRegex.test(cleaned);\n }\n\n getSupportedCorrespondents(): readonly Correspondent[] {\n return CORRESPONDENTS;\n }\n\n getCorrespondentInfo(correspondent: Correspondent): CorrespondentInfo {\n return CORRESPONDENT_INFO[correspondent];\n }\n\n getAllCorrespondentsInfo(): CorrespondentInfo[] {\n return Object.values(CORRESPONDENT_INFO);\n }\n\n detectCorrespondent(phone: string): Correspondent | null {\n const cleaned = phone.replace(/\\D/g, '');\n\n for (const [correspondent, info] of Object.entries(CORRESPONDENT_INFO)) {\n if (info.phoneRegex.test(cleaned)) {\n return correspondent as Correspondent;\n }\n }\n\n return null;\n }\n}\n","import { z } from 'zod';\nimport type { HttpClient } from '../core/http-client';\nimport type { Logger } from '../core/logger';\nimport { PawapayError } from '../core/errors';\nimport type {\n WalletBalance,\n WalletBalancesResponse,\n StatementRequest,\n StatementResponse,\n StatementStatusResponse,\n StatementData,\n} from '../types/finances';\n\nconst statementRequestSchema = z.object({\n wallet: z.object({\n country: z.string().length(3),\n currency: z.string().length(3),\n provider: z.string().optional(),\n }),\n callbackUrl: z.string().url(),\n startDate: z.string(),\n endDate: z.string(),\n compressed: z.boolean().optional(),\n});\n\nexport class FinancesModule {\n constructor(\n private readonly httpClient: HttpClient,\n private readonly logger: Logger\n ) {}\n\n /**\n * Get wallet balances - V2 API\n * Returns balances for all wallets configured on your account\n */\n async getWalletBalances(): Promise<WalletBalance[]> {\n this.logger.info('Fetching wallet balances');\n\n const response = await this.httpClient.get<WalletBalancesResponse>(\n '/v2/wallets/balances'\n );\n\n this.logger.info(`Retrieved ${response.balances.length} wallet balances`);\n\n return response.balances;\n }\n\n /**\n * Generate a statement for a wallet - V2 API\n * The statement can be downloaded from the callback URL or checked via status endpoint\n */\n async generateStatement(request: StatementRequest): Promise<StatementResponse> {\n const validated = statementRequestSchema.parse(request);\n\n this.logger.info('Generating statement', {\n wallet: validated.wallet,\n startDate: validated.startDate,\n endDate: validated.endDate,\n });\n\n const response = await this.httpClient.post<StatementResponse>(\n '/v2/statements',\n validated\n );\n\n if (response.status === 'REJECTED' && response.failureReason) {\n throw PawapayError.fromPawapayResponse(\n response.failureReason.failureCode,\n response.failureReason.failureMessage\n );\n }\n\n this.logger.info(`Statement ${response.statementId} status: ${response.status}`);\n\n return response;\n }\n\n /**\n * Check statement status - V2 API\n */\n async checkStatementStatus(statementId: string): Promise<StatementData> {\n if (!z.string().uuid().safeParse(statementId).success) {\n throw PawapayError.validation('Invalid statement ID format');\n }\n\n const response = await this.httpClient.get<StatementStatusResponse>(\n `/v2/statements/${statementId}`\n );\n\n if (response.status === 'NOT_FOUND' || !response.data) {\n throw PawapayError.notFound(`Statement ${statementId} not found`);\n }\n\n this.logger.info(`Statement ${statementId} status: ${response.data.status}`);\n\n return response.data;\n }\n\n /**\n * Poll until statement is ready\n */\n async pollStatementUntilComplete(\n statementId: string,\n options: { interval?: number; maxAttempts?: number } = {}\n ): Promise<StatementData> {\n const { interval = 5000, maxAttempts = 24 } = options;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const status = await this.checkStatementStatus(statementId);\n\n if (status.status === 'COMPLETED' || status.status === 'FAILED') {\n return status;\n }\n\n if (attempt < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n }\n\n return this.checkStatementStatus(statementId);\n }\n}\n","import type { SpaarkPayApiSdkConfig, ResolvedConfig, LogLevel } from './types/config';\nimport { resolveConfig, getConfigFromEnv } from './config';\nimport { HttpClient } from './core/http-client';\nimport { Logger } from './core/logger';\nimport { TransactionsModule } from './modules/transactions';\nimport { ProductsModule } from './modules/products';\nimport { WebhooksModule } from './modules/webhooks';\nimport { UtilsModule } from './modules/utils';\nimport { FinancesModule } from './modules/finances';\n\nexport class SpaarkPayApiSdk {\n private readonly config: ResolvedConfig;\n private readonly logger: Logger;\n private readonly httpClient: HttpClient;\n\n readonly transactions: TransactionsModule;\n readonly products: ProductsModule;\n readonly webhooks: WebhooksModule;\n readonly utils: UtilsModule;\n readonly finances: FinancesModule;\n\n constructor(config: SpaarkPayApiSdkConfig) {\n const envConfig = getConfigFromEnv();\n const mergedConfig: SpaarkPayApiSdkConfig = {\n ...envConfig,\n ...config,\n };\n\n this.config = resolveConfig(mergedConfig);\n this.logger = new Logger('SpaarkPayApiSdk', this.config.logLevel);\n this.httpClient = HttpClient.fromConfig(this.config, this.logger);\n\n this.transactions = new TransactionsModule(this.httpClient, this.logger);\n this.products = new ProductsModule(this.logger);\n this.webhooks = new WebhooksModule(this.httpClient, this.logger, {\n webhookSecret: this.getWebhookSecretFromEnv(),\n });\n this.utils = new UtilsModule(this.httpClient, this.logger);\n this.finances = new FinancesModule(this.httpClient, this.logger);\n\n this.logger.info(`SpaarkPayApiSdk initialized`, {\n environment: this.config.environment,\n baseUrl: this.config.baseUrl,\n });\n }\n\n private getWebhookSecretFromEnv(): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env['PAWAPAY_WEBHOOK_SECRET'];\n }\n return undefined;\n }\n\n getConfig(): Readonly<ResolvedConfig> {\n return { ...this.config };\n }\n\n setLogLevel(level: LogLevel): void {\n this.logger.setLevel(level);\n }\n\n setWebhookSecret(secret: string): void {\n this.webhooks.setWebhookSecret(secret);\n }\n}\n","import type {\n WebhookEventType,\n PawapayWebhookEvent,\n DepositCallbackData,\n PayoutCallbackData,\n} from '../types/webhooks';\nimport type { Correspondent } from '../constants/correspondents';\n\nexport interface WebhookGeneratorOptions {\n transactionId?: string;\n amount?: string;\n currency?: string;\n correspondent?: Correspondent;\n phoneNumber?: string;\n status?: 'COMPLETED' | 'FAILED';\n failureCode?: string;\n failureMessage?: string;\n}\n\nconst generateUUID = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\nexport function generateDepositWebhook(\n eventType: 'deposit.accepted' | 'deposit.completed' | 'deposit.failed',\n options: WebhookGeneratorOptions = {}\n): PawapayWebhookEvent<DepositCallbackData> {\n const {\n transactionId = generateUUID(),\n amount = '5000',\n currency = 'XAF',\n correspondent = 'MTN_MOMO_CMR',\n phoneNumber = '237670000000',\n status = eventType === 'deposit.failed' ? 'FAILED' : 'COMPLETED',\n failureCode = 'INSUFFICIENT_FUNDS',\n failureMessage = 'The payer has insufficient funds',\n } = options;\n\n const now = new Date().toISOString();\n\n const data: DepositCallbackData = {\n depositId: transactionId,\n status,\n amount,\n currency,\n correspondent,\n payer: {\n type: 'MSISDN',\n address: {\n value: phoneNumber,\n },\n },\n customerTimestamp: now,\n created: now,\n };\n\n if (status === 'COMPLETED') {\n data.receivedByPayer = now;\n }\n\n if (status === 'FAILED') {\n data.failureReason = {\n failureCode,\n failureMessage,\n };\n }\n\n return {\n eventId: generateUUID(),\n eventType,\n timestamp: now,\n data,\n };\n}\n\nexport function generatePayoutWebhook(\n eventType: 'payout.accepted' | 'payout.completed' | 'payout.failed',\n options: WebhookGeneratorOptions = {}\n): PawapayWebhookEvent<PayoutCallbackData> {\n const {\n transactionId = generateUUID(),\n amount = '5000',\n currency = 'XAF',\n correspondent = 'MTN_MOMO_CMR',\n phoneNumber = '237670000000',\n status = eventType === 'payout.failed' ? 'FAILED' : 'COMPLETED',\n failureCode = 'RECIPIENT_NOT_FOUND',\n failureMessage = 'The recipient account was not found',\n } = options;\n\n const now = new Date().toISOString();\n\n const data: PayoutCallbackData = {\n payoutId: transactionId,\n status,\n amount,\n currency,\n correspondent,\n recipient: {\n type: 'MSISDN',\n address: {\n value: phoneNumber,\n },\n },\n customerTimestamp: now,\n created: now,\n };\n\n if (status === 'COMPLETED') {\n data.receivedByRecipient = now;\n }\n\n if (status === 'FAILED') {\n data.failureReason = {\n failureCode,\n failureMessage,\n };\n }\n\n return {\n eventId: generateUUID(),\n eventType,\n timestamp: now,\n data,\n };\n}\n\nexport interface RefundCallbackData {\n refundId: string;\n depositId: string;\n status: 'COMPLETED' | 'FAILED';\n amount: string;\n currency: string;\n correspondent: string;\n recipient: {\n type: string;\n address: {\n value: string;\n };\n };\n created: string;\n failureReason?: {\n failureCode: string;\n failureMessage: string;\n };\n}\n\nexport function generateRefundWebhook(\n eventType: 'refund.completed' | 'refund.failed',\n options: WebhookGeneratorOptions & { depositId?: string } = {}\n): PawapayWebhookEvent<RefundCallbackData> {\n const {\n transactionId = generateUUID(),\n depositId = generateUUID(),\n amount = '5000',\n currency = 'XAF',\n correspondent = 'MTN_MOMO_CMR',\n phoneNumber = '237670000000',\n status = eventType === 'refund.failed' ? 'FAILED' : 'COMPLETED',\n failureCode = 'REFUND_LIMIT_EXCEEDED',\n failureMessage = 'The refund limit has been exceeded',\n } = options;\n\n const now = new Date().toISOString();\n\n const data: RefundCallbackData = {\n refundId: transactionId,\n depositId,\n status,\n amount,\n currency,\n correspondent,\n recipient: {\n type: 'MSISDN',\n address: {\n value: phoneNumber,\n },\n },\n created: now,\n };\n\n if (status === 'FAILED') {\n data.failureReason = {\n failureCode,\n failureMessage,\n };\n }\n\n return {\n eventId: generateUUID(),\n eventType,\n timestamp: now,\n data,\n };\n}\n\nexport type MockWebhookEvent =\n | PawapayWebhookEvent<DepositCallbackData>\n | PawapayWebhookEvent<PayoutCallbackData>\n | PawapayWebhookEvent<RefundCallbackData>;\n\nexport function generateWebhook(\n eventType: WebhookEventType,\n options: WebhookGeneratorOptions & { depositId?: string } = {}\n): MockWebhookEvent {\n if (eventType.startsWith('deposit.')) {\n return generateDepositWebhook(\n eventType as 'deposit.accepted' | 'deposit.completed' | 'deposit.failed',\n options\n );\n }\n\n if (eventType.startsWith('payout.')) {\n return generatePayoutWebhook(\n eventType as 'payout.accepted' | 'payout.completed' | 'payout.failed',\n options\n );\n }\n\n return generateRefundWebhook(\n eventType as 'refund.completed' | 'refund.failed',\n options\n );\n}\n\nexport const WEBHOOK_EVENT_TYPES: WebhookEventType[] = [\n 'deposit.accepted',\n 'deposit.completed',\n 'deposit.failed',\n 'payout.accepted',\n 'payout.completed',\n 'payout.failed',\n 'refund.completed',\n 'refund.failed',\n];\n\nexport const FAILURE_CODES = {\n deposit: [\n { code: 'INSUFFICIENT_FUNDS', message: 'The payer has insufficient funds' },\n { code: 'INVALID_PHONE_NUMBER', message: 'The phone number is invalid' },\n { code: 'TIMEOUT', message: 'The transaction timed out' },\n { code: 'RECIPIENT_NOT_REGISTERED', message: 'The recipient is not registered for mobile money' },\n { code: 'DECLINED', message: 'The transaction was declined by the payer' },\n ],\n payout: [\n { code: 'RECIPIENT_NOT_FOUND', message: 'The recipient account was not found' },\n { code: 'RECIPIENT_NOT_REGISTERED', message: 'The recipient is not registered for mobile money' },\n { code: 'INVALID_PHONE_NUMBER', message: 'The phone number is invalid' },\n { code: 'TIMEOUT', message: 'The transaction timed out' },\n { code: 'DAILY_LIMIT_EXCEEDED', message: 'The daily transaction limit has been exceeded' },\n ],\n refund: [\n { code: 'REFUND_LIMIT_EXCEEDED', message: 'The refund limit has been exceeded' },\n { code: 'ORIGINAL_DEPOSIT_NOT_FOUND', message: 'The original deposit was not found' },\n { code: 'REFUND_ALREADY_PROCESSED', message: 'A refund has already been processed for this deposit' },\n { code: 'TIMEOUT', message: 'The refund request timed out' },\n ],\n};\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport type { Correspondent } from './constants/correspondents';\nimport type { DepositResponse, PayoutResponse } from './types/transactions';\nimport type { WebhookEventType } from './types/webhooks';\nimport {\n generateWebhook,\n WEBHOOK_EVENT_TYPES,\n} from './mocks/webhook-generators';\n\nexport {\n SpaarkPaySdkFinanceDashboard,\n type SpaarkPaySdkFinanceDashboardProps,\n type Transaction,\n type TransactionType,\n type TransactionStatus,\n} from './components/SpaarkPaySdkFinanceDashboard';\n\ntype OperationStatus = 'idle' | 'loading' | 'success' | 'error';\ntype TabType = 'deposit' | 'payout' | 'status' | 'toolkit' | 'finances' | 'webhooks';\n\ninterface TestResult {\n id: string;\n operation: string;\n status: OperationStatus;\n response?: unknown;\n error?: string;\n timestamp: string;\n}\n\ninterface WebhookTestEvent {\n id: string;\n eventType: string;\n payload: unknown;\n signature: string;\n receivedAt: string;\n isVerified: boolean | null;\n}\n\nexport interface PawapayTestDashboardProps {\n apiKey?: string;\n environment?: 'sandbox' | 'production';\n className?: string;\n demoMode?: boolean;\n /** Base path for API routes (e.g., '/api/pawapay'). When set, requests go through your server instead of directly to Pawapay. */\n apiBasePath?: string;\n onDepositComplete?: (response: DepositResponse) => void;\n onPayoutComplete?: (response: PayoutResponse) => void;\n onError?: (error: Error) => void;\n}\n\n// Mock response generators for demo mode (V2 API format)\nconst createMockDepositResponse = (txId: string): DepositResponse => ({\n depositId: txId,\n status: 'ACCEPTED',\n created: new Date().toISOString(),\n nextStep: 'FINAL_STATUS',\n});\n\nconst createMockPayoutResponse = (txId: string): PayoutResponse => ({\n payoutId: txId,\n status: 'ACCEPTED',\n created: new Date().toISOString(),\n});\n\nconst createMockStatusResponse = (txId: string) => ({\n depositId: txId,\n status: ['COMPLETED', 'ACCEPTED', 'PROCESSING', 'ENQUEUED'][Math.floor(Math.random() * 4)],\n created: new Date(Date.now() - 60000).toISOString(),\n amount: '5000',\n currency: 'XAF',\n country: 'CMR',\n payer: {\n type: 'MMO',\n accountDetails: {\n phoneNumber: '237670000000',\n provider: 'MTN_MOMO_CMR',\n },\n },\n});\n\nconst createMockAvailabilityResponse = () => [\n {\n country: 'CMR',\n providers: [\n {\n provider: 'MTN_MOMO_CMR',\n operationTypes: [\n { operationType: 'DEPOSIT', status: 'OPERATIONAL' },\n { operationType: 'PAYOUT', status: 'OPERATIONAL' },\n ],\n },\n {\n provider: 'ORANGE_CMR',\n operationTypes: [\n { operationType: 'DEPOSIT', status: 'OPERATIONAL' },\n { operationType: 'PAYOUT', status: 'DELAYED' },\n ],\n },\n ],\n },\n];\n\nconst createMockPredictResponse = (phone: string) => ({\n country: 'CMR',\n provider: phone.startsWith('23767') ? 'MTN_MOMO_CMR' : 'ORANGE_CMR',\n phoneNumber: phone.replace(/\\D/g, ''),\n});\n\nconst createMockActiveConfigResponse = () => ({\n companyName: 'Demo Company',\n signatureConfiguration: {\n signedRequestsOnly: false,\n signedCallbacks: true,\n },\n countries: [\n {\n country: 'CMR',\n displayName: { en: 'Cameroon', fr: 'Cameroun' },\n prefix: '237',\n flag: 'https://cdn.pawapay.io/flags/cmr.svg',\n providers: [\n {\n provider: 'MTN_MOMO_CMR',\n displayName: 'MTN Mobile Money',\n nameDisplayedToCustomer: 'MTN MoMo',\n currencies: [\n {\n currency: 'XAF',\n displayName: 'CFA Franc',\n operationTypes: {\n DEPOSIT: { minAmount: '100', maxAmount: '1000000', status: 'OPERATIONAL' },\n PAYOUT: { minAmount: '100', maxAmount: '500000', status: 'OPERATIONAL' },\n },\n },\n ],\n },\n ],\n },\n ],\n});\n\nconst createMockWalletBalancesResponse = () => ({\n balances: [\n { country: 'CMR', currency: 'XAF', balance: '1250000.00' },\n { country: 'COG', currency: 'XAF', balance: '450000.00' },\n { country: 'GAB', currency: 'XAF', balance: '780000.00' },\n ],\n});\n\nconst createMockPublicKeysResponse = () => [\n {\n id: 'key-001',\n key: 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...',\n },\n];\n\nconst simulateDelay = (ms: number = 800) => new Promise(resolve => setTimeout(resolve, ms + Math.random() * 400));\n\n// HMAC-SHA256 computation using Web Crypto API (browser-compatible)\nasync function computeHmacSha256(message: string, secret: string): Promise<string> {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(message));\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nconst generateUUID = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\nconst PROVIDER_OPTIONS: Array<{ value: Correspondent; label: string; country: string }> = [\n { value: 'MTN_MOMO_CMR', label: 'MTN Mobile Money', country: 'Cameroun' },\n { value: 'ORANGE_CMR', label: 'Orange Money', country: 'Cameroun' },\n { value: 'MTN_MOMO_COG', label: 'MTN Mobile Money', country: 'Congo' },\n { value: 'AIRTEL_COG', label: 'Airtel Money', country: 'Congo' },\n { value: 'MTN_MOMO_GAB', label: 'MTN Mobile Money', country: 'Gabon' },\n { value: 'AIRTEL_GAB', label: 'Airtel Money', country: 'Gabon' },\n];\n\nconst CURRENCY_OPTIONS = [\n { value: 'XAF', label: 'XAF (CFA Franc BEAC)' },\n { value: 'XOF', label: 'XOF (CFA Franc BCEAO)' },\n { value: 'GHS', label: 'GHS (Ghana Cedi)' },\n { value: 'KES', label: 'KES (Kenyan Shilling)' },\n { value: 'RWF', label: 'RWF (Rwandan Franc)' },\n { value: 'TZS', label: 'TZS (Tanzanian Shilling)' },\n { value: 'UGX', label: 'UGX (Ugandan Shilling)' },\n { value: 'ZMW', label: 'ZMW (Zambian Kwacha)' },\n];\n\nexport function PawapayTestDashboard({\n apiKey: initialApiKey = '',\n environment: initialEnvironment = 'sandbox',\n className = '',\n demoMode: initialDemoMode = false,\n apiBasePath = '/api/pawapay',\n onDepositComplete,\n onPayoutComplete,\n onError,\n}: PawapayTestDashboardProps) {\n const [apiKey, setApiKey] = useState(initialApiKey);\n const [environment, setEnvironment] = useState<'sandbox' | 'production'>(initialEnvironment);\n const [isConfigured, setIsConfigured] = useState(!!initialApiKey || initialDemoMode);\n const [isDemoMode, setIsDemoMode] = useState(initialDemoMode);\n\n const [activeTab, setActiveTab] = useState<TabType>('deposit');\n const [phoneNumber, setPhoneNumber] = useState('237670000000');\n const [amount, setAmount] = useState('5000');\n const [currency, setCurrency] = useState('XAF');\n const [provider, setProvider] = useState<Correspondent>('MTN_MOMO_CMR');\n const [description, setDescription] = useState('Test Payment');\n const [transactionId, setTransactionId] = useState('');\n\n const [results, setResults] = useState<TestResult[]>([]);\n const [currentStatus, setCurrentStatus] = useState<OperationStatus>('idle');\n\n // Webhook testing states\n const [webhookSecret, setWebhookSecret] = useState('whsec_test_secret_key');\n const [webhookEvents, setWebhookEvents] = useState<WebhookTestEvent[]>([]);\n const [webhookEventType, setWebhookEventType] = useState<WebhookEventType>('deposit.completed');\n const [webhookAmount, setWebhookAmount] = useState('5000');\n const [webhookPhone, setWebhookPhone] = useState('237670000000');\n const [webhookProvider, setWebhookProvider] = useState<Correspondent>('MTN_MOMO_CMR');\n const [generatedPayload, setGeneratedPayload] = useState<string>('');\n const [generatedSignature, setGeneratedSignature] = useState<string>('');\n const [verifyPayload, setVerifyPayload] = useState<string>('');\n const [verifySignature, setVerifySignature] = useState<string>('');\n const [verifySecret, setVerifySecret] = useState<string>('');\n const [verifyResult, setVerifyResult] = useState<boolean | null>(null);\n const [parseInput, setParseInput] = useState<string>('');\n const [parsedEvent, setParsedEvent] = useState<Record<string, unknown> | null>(null);\n const [parseError, setParseError] = useState<string>('');\n const [eventLogFilter, setEventLogFilter] = useState<'all' | 'deposit' | 'payout' | 'refund'>('all');\n\n const addResult = useCallback((operation: string, status: OperationStatus, response?: unknown, error?: string) => {\n const result: TestResult = {\n id: generateUUID(),\n operation,\n status,\n response,\n error,\n timestamp: new Date().toLocaleTimeString(),\n };\n setResults((prev) => [result, ...prev].slice(0, 20));\n }, []);\n\n const handleConfigure = useCallback(() => {\n if (!apiKey.trim()) {\n addResult('Configuration', 'error', undefined, 'API Key is required');\n return;\n }\n setIsConfigured(true);\n setIsDemoMode(false);\n addResult('Configuration', 'success', { environment, configured: true, apiBasePath });\n }, [apiKey, environment, apiBasePath, addResult]);\n\n const handleDemoMode = useCallback(() => {\n setIsDemoMode(true);\n setIsConfigured(true);\n addResult('Configuration', 'success', { mode: 'demo', message: 'Demo mode activated - responses are simulated' });\n }, [addResult]);\n\n const handleDeposit = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n const txId = generateUUID();\n setTransactionId(txId);\n\n let response: DepositResponse;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockDepositResponse(txId);\n } else {\n const res = await fetch(`${apiBasePath}/deposit`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n apiKey,\n environment,\n amount: parseFloat(amount),\n currency,\n provider,\n phoneNumber,\n customerMessage: description.slice(0, 22),\n transactionId: txId,\n }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Deposit failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Deposit', 'success', response);\n onDepositComplete?.(response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Deposit failed';\n addResult('Deposit', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, amount, currency, provider, phoneNumber, description, addResult, onDepositComplete, onError]);\n\n const handlePayout = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n const txId = generateUUID();\n setTransactionId(txId);\n\n let response: PayoutResponse;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockPayoutResponse(txId);\n } else {\n const res = await fetch(`${apiBasePath}/payout`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n apiKey,\n environment,\n amount: parseFloat(amount),\n currency,\n provider,\n phoneNumber,\n transactionId: txId,\n }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Payout failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Payout', 'success', response);\n onPayoutComplete?.(response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Payout failed';\n addResult('Payout', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, amount, currency, provider, phoneNumber, addResult, onPayoutComplete, onError]);\n\n const handleCheckStatus = useCallback(async () => {\n if ((!apiKey && !isDemoMode) || !transactionId) {\n addResult('Check Status', 'error', undefined, 'No transaction ID');\n return;\n }\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockStatusResponse(transactionId);\n } else {\n const res = await fetch(`${apiBasePath}/status`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment, transactionId }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Status check failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Check Status', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Status check failed';\n addResult('Check Status', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, transactionId, addResult, onError]);\n\n const handleGetAvailability = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockAvailabilityResponse();\n } else {\n const res = await fetch(`${apiBasePath}/availability`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Availability check failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Provider Availability', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Availability check failed';\n addResult('Provider Availability', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, addResult, onError]);\n\n const handlePredictProvider = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockPredictResponse(phoneNumber);\n } else {\n const res = await fetch(`${apiBasePath}/predict-provider`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment, phoneNumber }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Prediction failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Predict Provider', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Prediction failed';\n addResult('Predict Provider', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, phoneNumber, addResult, onError]);\n\n const handleGetActiveConfig = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockActiveConfigResponse();\n } else {\n const res = await fetch(`${apiBasePath}/active-config`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Failed to get config');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Active Configuration', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Failed to get config';\n addResult('Active Configuration', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, addResult, onError]);\n\n const handleGetPublicKeys = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockPublicKeysResponse();\n } else {\n const res = await fetch(`${apiBasePath}/public-keys`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Failed to get public keys');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Public Keys', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Failed to get public keys';\n addResult('Public Keys', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, addResult, onError]);\n\n const handleGetWalletBalances = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockWalletBalancesResponse();\n } else {\n const res = await fetch(`${apiBasePath}/wallet-balances`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Failed to get balances');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Wallet Balances', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Failed to get balances';\n addResult('Wallet Balances', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, addResult, onError]);\n\n const copyToClipboard = useCallback((text: string) => {\n navigator.clipboard.writeText(text);\n }, []);\n\n if (!isConfigured) {\n return (\n <div className={`space-y-8 ${className}`}>\n <div>\n <h1 className=\"text-2xl font-bold tracking-tight\">Spaark Pay Console</h1>\n <p className=\"text-muted-foreground mt-1\">\n Configurez vos identifiants PawaPay pour commencer\n </p>\n </div>\n\n <div className=\"border border-border bg-background p-6 max-w-md space-y-6\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 bg-muted flex items-center justify-center\">\n <SettingsIcon />\n </div>\n <div>\n <h2 className=\"font-semibold\">SDK Configuration</h2>\n <p className=\"text-xs text-muted-foreground\">Enter your API credentials</p>\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">API Key</label>\n <input\n type=\"password\"\n placeholder=\"pk_sandbox_...\"\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Environnement</label>\n <div className=\"flex gap-2\">\n <button\n onClick={() => setEnvironment('sandbox')}\n className={`h-8 px-3 text-xs font-medium border transition-colors flex items-center gap-1.5 ${\n environment === 'sandbox'\n ? 'bg-blue-600 text-white border-blue-600'\n : 'bg-background border-border hover:bg-muted'\n }`}\n >\n <span className={`w-2 h-2 rounded-full ${environment === 'sandbox' ? 'bg-blue-200' : 'bg-blue-500'}`} />\n Sandbox\n </button>\n <button\n onClick={() => setEnvironment('production')}\n className={`h-8 px-3 text-xs font-medium border transition-colors flex items-center gap-1.5 ${\n environment === 'production'\n ? 'bg-green-600 text-white border-green-600'\n : 'bg-background border-border hover:bg-muted'\n }`}\n >\n <span className={`w-2 h-2 rounded-full ${environment === 'production' ? 'bg-green-200' : 'bg-green-500'}`} />\n Production\n </button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {environment === 'sandbox'\n ? 'Utilisez le sandbox pour tester sans frais réels'\n : 'Attention : les transactions en production sont réelles'\n }\n </p>\n </div>\n\n <button\n onClick={handleConfigure}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 transition-colors flex items-center justify-center gap-2\"\n >\n <PlayIcon />\n Initialize SDK\n </button>\n\n <div className=\"relative flex items-center py-2\">\n <div className=\"flex-grow border-t border-border\"></div>\n <span className=\"flex-shrink mx-3 text-xs text-muted-foreground\">ou</span>\n <div className=\"flex-grow border-t border-border\"></div>\n </div>\n\n <button\n onClick={handleDemoMode}\n className=\"w-full h-8 px-3 text-xs font-medium border border-border bg-background hover:bg-muted transition-colors flex items-center justify-center gap-2\"\n >\n <BeakerIcon />\n Mode Démo (sans API key)\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`space-y-6 ${className}`}>\n <div className=\"flex items-center justify-between flex-wrap gap-4\">\n <div>\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-2xl font-bold tracking-tight\">Spaark Pay Console</h1>\n {isDemoMode ? (\n <span className=\"px-2 py-0.5 text-xs font-medium bg-amber-100 text-amber-800 dark:bg-amber-900 dark:text-amber-200\">\n DEMO\n </span>\n ) : environment === 'production' ? (\n <span className=\"px-2 py-0.5 text-xs font-medium bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200\">\n PRODUCTION\n </span>\n ) : (\n <span className=\"px-2 py-0.5 text-xs font-medium bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200\">\n SANDBOX\n </span>\n )}\n </div>\n <p className=\"text-muted-foreground mt-1\">\n {isDemoMode\n ? 'Mode démo - Les réponses sont simulées'\n : environment === 'production'\n ? 'Mode production - Transactions réelles'\n : 'Mode sandbox - Environnement de test'\n }\n </p>\n </div>\n <button\n onClick={() => setIsConfigured(false)}\n className=\"h-8 px-3 text-xs font-medium border border-border bg-background hover:bg-muted transition-colors flex items-center gap-2\"\n >\n <SettingsIcon />\n Reconfigure\n </button>\n </div>\n\n <div className=\"grid lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Tabs */}\n <div className=\"flex flex-wrap gap-1 bg-muted p-1\">\n <button\n onClick={() => setActiveTab('deposit')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'deposit' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <WalletIcon />\n Deposit\n </button>\n <button\n onClick={() => setActiveTab('payout')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'payout' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <PhoneIcon />\n Payout\n </button>\n <button\n onClick={() => setActiveTab('status')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'status' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <RefreshIcon />\n Status\n </button>\n <button\n onClick={() => setActiveTab('toolkit')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'toolkit' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <ToolkitIcon />\n Toolkit\n </button>\n <button\n onClick={() => setActiveTab('finances')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'finances' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <ChartIcon />\n Finances\n </button>\n <button\n onClick={() => setActiveTab('webhooks')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'webhooks' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <WebhookIcon />\n Webhooks\n </button>\n </div>\n\n {/* Deposit Tab */}\n {activeTab === 'deposit' && (\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Initiate Deposit</h3>\n <p className=\"text-xs text-muted-foreground\">Collect payment from a Mobile Money user</p>\n </div>\n\n <div className=\"grid sm:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Phone Number</label>\n <input\n placeholder=\"237670000000\"\n value={phoneNumber}\n onChange={(e) => setPhoneNumber(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Amount</label>\n <input\n type=\"number\"\n placeholder=\"5000\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Currency</label>\n <select\n value={currency}\n onChange={(e) => setCurrency(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {CURRENCY_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>{c.label}</option>\n ))}\n </select>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Provider</label>\n <select\n value={provider}\n onChange={(e) => setProvider(e.target.value as Correspondent)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {PROVIDER_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>{c.label} ({c.country})</option>\n ))}\n </select>\n </div>\n <div className=\"space-y-2 sm:col-span-2\">\n <label className=\"text-xs font-medium\">Customer Message (4-22 chars)</label>\n <input\n placeholder=\"Payment description\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n maxLength={22}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n </div>\n\n <button\n onClick={handleDeposit}\n disabled={currentStatus === 'loading'}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <PlayIcon />}\n Execute Deposit\n </button>\n </div>\n )}\n\n {/* Payout Tab */}\n {activeTab === 'payout' && (\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Initiate Payout</h3>\n <p className=\"text-xs text-muted-foreground\">Send money to a Mobile Money account</p>\n </div>\n\n <div className=\"grid sm:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Recipient Phone</label>\n <input\n placeholder=\"237670000000\"\n value={phoneNumber}\n onChange={(e) => setPhoneNumber(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Amount</label>\n <input\n type=\"number\"\n placeholder=\"5000\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Currency</label>\n <select\n value={currency}\n onChange={(e) => setCurrency(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {CURRENCY_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>{c.label}</option>\n ))}\n </select>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Provider</label>\n <select\n value={provider}\n onChange={(e) => setProvider(e.target.value as Correspondent)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {PROVIDER_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>{c.label} ({c.country})</option>\n ))}\n </select>\n </div>\n </div>\n\n <button\n onClick={handlePayout}\n disabled={currentStatus === 'loading'}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <PlayIcon />}\n Execute Payout\n </button>\n </div>\n )}\n\n {/* Status Tab */}\n {activeTab === 'status' && (\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Check Transaction Status</h3>\n <p className=\"text-xs text-muted-foreground\">Query the status of a transaction</p>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Transaction ID</label>\n <div className=\"flex gap-2\">\n <input\n placeholder=\"Enter transaction ID (UUID)\"\n value={transactionId}\n onChange={(e) => setTransactionId(e.target.value)}\n className=\"flex-1 h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring font-mono\"\n />\n {transactionId && (\n <button\n onClick={() => copyToClipboard(transactionId)}\n className=\"w-8 h-8 border border-border bg-background hover:bg-muted transition-colors flex items-center justify-center\"\n title=\"Copy to clipboard\"\n >\n <CopyIcon />\n </button>\n )}\n </div>\n </div>\n\n <button\n onClick={handleCheckStatus}\n disabled={currentStatus === 'loading' || !transactionId}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <RefreshIcon />}\n Check Status\n </button>\n </div>\n </div>\n )}\n\n {/* Toolkit Tab */}\n {activeTab === 'toolkit' && (\n <div className=\"space-y-4\">\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Predict Provider</h3>\n <p className=\"text-xs text-muted-foreground\">Predict the provider from a phone number</p>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Phone Number</label>\n <input\n placeholder=\"+237 670 000 000\"\n value={phoneNumber}\n onChange={(e) => setPhoneNumber(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n\n <button\n onClick={handlePredictProvider}\n disabled={currentStatus === 'loading'}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <SearchIcon />}\n Predict Provider\n </button>\n </div>\n\n <div className=\"grid sm:grid-cols-3 gap-3\">\n <button\n onClick={handleGetAvailability}\n disabled={currentStatus === 'loading'}\n className=\"h-10 px-3 text-xs font-medium border border-border bg-background hover:bg-muted disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n <SignalIcon />\n Provider Availability\n </button>\n <button\n onClick={handleGetActiveConfig}\n disabled={currentStatus === 'loading'}\n className=\"h-10 px-3 text-xs font-medium border border-border bg-background hover:bg-muted disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n <SettingsIcon />\n Active Config\n </button>\n <button\n onClick={handleGetPublicKeys}\n disabled={currentStatus === 'loading'}\n className=\"h-10 px-3 text-xs font-medium border border-border bg-background hover:bg-muted disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n <KeyIcon />\n Public Keys\n </button>\n </div>\n </div>\n )}\n\n {/* Finances Tab */}\n {activeTab === 'finances' && (\n <div className=\"space-y-4\">\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Wallet Balances</h3>\n <p className=\"text-xs text-muted-foreground\">View balances for all your wallets</p>\n </div>\n\n <button\n onClick={handleGetWalletBalances}\n disabled={currentStatus === 'loading'}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <WalletIcon />}\n Get Wallet Balances\n </button>\n </div>\n\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Statements</h3>\n <p className=\"text-xs text-muted-foreground\">Generate financial statements for your wallets</p>\n </div>\n\n <div className=\"p-4 bg-muted/50 text-xs text-muted-foreground\">\n Statement generation requires callback URL configuration. Use the SDK directly:\n <pre className=\"mt-2 p-2 bg-background overflow-x-auto\">\n{`await sdk.finances.generateStatement({\n wallet: { country: 'CMR', currency: 'XAF' },\n callbackUrl: 'https://your-site.com/callback',\n startDate: '2025-01-01T00:00:00Z',\n endDate: '2025-01-31T23:59:59Z',\n});`}\n </pre>\n </div>\n </div>\n </div>\n )}\n\n {/* Webhooks Tab */}\n {activeTab === 'webhooks' && (\n <div className=\"space-y-4\">\n {/* Webhook Secret Configuration */}\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Webhook Secret</h3>\n <p className=\"text-xs text-muted-foreground\">Configure the secret used for signing webhooks</p>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Secret Key</label>\n <input\n type=\"text\"\n placeholder=\"whsec_...\"\n value={webhookSecret}\n onChange={(e) => setWebhookSecret(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs font-mono border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n </div>\n\n {/* Webhook Simulator */}\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Webhook Simulator</h3>\n <p className=\"text-xs text-muted-foreground\">Generate mock webhook events for testing</p>\n </div>\n\n <div className=\"grid sm:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Event Type</label>\n <select\n value={webhookEventType}\n onChange={(e) => setWebhookEventType(e.target.value as WebhookEventType)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {WEBHOOK_EVENT_TYPES.map((type) => (\n <option key={type} value={type}>{type}</option>\n ))}\n </select>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Amount</label>\n <input\n type=\"number\"\n placeholder=\"5000\"\n value={webhookAmount}\n onChange={(e) => setWebhookAmount(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Phone Number</label>\n <input\n placeholder=\"237670000000\"\n value={webhookPhone}\n onChange={(e) => setWebhookPhone(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Provider</label>\n <select\n value={webhookProvider}\n onChange={(e) => setWebhookProvider(e.target.value as Correspondent)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {PROVIDER_OPTIONS.map((p) => (\n <option key={p.value} value={p.value}>{p.label} ({p.country})</option>\n ))}\n </select>\n </div>\n </div>\n\n <button\n onClick={async () => {\n const event = generateWebhook(webhookEventType, {\n amount: webhookAmount,\n phoneNumber: webhookPhone,\n correspondent: webhookProvider,\n });\n const payload = JSON.stringify(event, null, 2);\n const signature = await computeHmacSha256(JSON.stringify(event), webhookSecret);\n setGeneratedPayload(payload);\n setGeneratedSignature(signature);\n\n // Add to event log\n const newEvent: WebhookTestEvent = {\n id: generateUUID(),\n eventType: webhookEventType,\n payload: event,\n signature,\n receivedAt: new Date().toLocaleTimeString(),\n isVerified: null,\n };\n setWebhookEvents((prev) => [newEvent, ...prev].slice(0, 50));\n addResult('Generate Webhook', 'success', { eventType: webhookEventType, eventId: event.eventId });\n }}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 transition-colors flex items-center justify-center gap-2\"\n >\n <PlayIcon />\n Generate Event\n </button>\n\n {generatedPayload && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-xs font-medium\">Generated Payload</label>\n <button\n onClick={() => copyToClipboard(generatedPayload)}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Copy\n </button>\n </div>\n <pre className=\"text-xs bg-muted p-3 overflow-x-auto max-h-48\">\n {generatedPayload}\n </pre>\n <div className=\"flex items-center gap-2\">\n <label className=\"text-xs font-medium\">Signature:</label>\n <code className=\"text-xs bg-muted px-2 py-1 font-mono flex-1 overflow-x-auto\">\n {generatedSignature}\n </code>\n <button\n onClick={() => copyToClipboard(generatedSignature)}\n className=\"w-8 h-8 border border-border bg-background hover:bg-muted transition-colors flex items-center justify-center\"\n >\n <CopyIcon />\n </button>\n </div>\n </div>\n )}\n </div>\n\n {/* Signature Verifier */}\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Signature Verifier</h3>\n <p className=\"text-xs text-muted-foreground\">Test webhook signature verification</p>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Payload (JSON)</label>\n <textarea\n placeholder='{\"eventId\": \"...\", \"eventType\": \"deposit.completed\", ...}'\n value={verifyPayload}\n onChange={(e) => setVerifyPayload(e.target.value)}\n rows={4}\n className=\"w-full px-2.5 py-2 text-xs font-mono border border-input bg-transparent rounded-none outline-none focus:border-ring resize-none\"\n />\n </div>\n <div className=\"grid sm:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Signature</label>\n <input\n placeholder=\"HMAC-SHA256 signature\"\n value={verifySignature}\n onChange={(e) => setVerifySignature(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs font-mono border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Secret</label>\n <input\n type=\"password\"\n placeholder=\"whsec_...\"\n value={verifySecret}\n onChange={(e) => setVerifySecret(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs font-mono border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n </div>\n\n <button\n onClick={async () => {\n try {\n const parsedPayload = JSON.parse(verifyPayload);\n const computedSignature = await computeHmacSha256(JSON.stringify(parsedPayload), verifySecret);\n const isValid = computedSignature === verifySignature;\n setVerifyResult(isValid);\n addResult('Verify Signature', isValid ? 'success' : 'error', {\n isValid,\n expected: computedSignature,\n received: verifySignature,\n });\n } catch {\n setVerifyResult(false);\n addResult('Verify Signature', 'error', undefined, 'Invalid JSON payload');\n }\n }}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 transition-colors flex items-center justify-center gap-2\"\n >\n <ShieldIcon />\n Verify Signature\n </button>\n\n {verifyResult !== null && (\n <div className={`p-3 text-xs flex items-center gap-2 ${\n verifyResult ? 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200' : 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200'\n }`}>\n {verifyResult ? <CheckIcon className=\"text-green-600\" /> : <XIcon className=\"text-red-600\" />}\n {verifyResult ? 'Signature is valid' : 'Signature is invalid'}\n </div>\n )}\n </div>\n </div>\n\n {/* Event Parser */}\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Event Parser</h3>\n <p className=\"text-xs text-muted-foreground\">Parse and analyze raw webhook JSON</p>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Raw JSON</label>\n <textarea\n placeholder='Paste webhook JSON here...'\n value={parseInput}\n onChange={(e) => setParseInput(e.target.value)}\n rows={4}\n className=\"w-full px-2.5 py-2 text-xs font-mono border border-input bg-transparent rounded-none outline-none focus:border-ring resize-none\"\n />\n </div>\n\n <button\n onClick={() => {\n try {\n const parsed = JSON.parse(parseInput) as Record<string, unknown>;\n setParsedEvent(parsed);\n setParseError('');\n addResult('Parse Event', 'success', { eventType: parsed.eventType, eventId: parsed.eventId });\n } catch (e) {\n setParsedEvent(null);\n setParseError(e instanceof Error ? e.message : 'Invalid JSON');\n addResult('Parse Event', 'error', undefined, 'Invalid JSON');\n }\n }}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 transition-colors flex items-center justify-center gap-2\"\n >\n <CodeIcon />\n Parse Event\n </button>\n\n {parseError && (\n <div className=\"p-3 text-xs bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200\">\n {parseError}\n </div>\n )}\n\n {parsedEvent && (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-2 text-xs\">\n <div className=\"p-2 bg-muted\">\n <span className=\"text-muted-foreground\">Event ID:</span>\n <p className=\"font-mono truncate\">{String(parsedEvent.eventId ?? 'N/A')}</p>\n </div>\n <div className=\"p-2 bg-muted\">\n <span className=\"text-muted-foreground\">Event Type:</span>\n <p className=\"font-medium\">{String(parsedEvent.eventType ?? 'N/A')}</p>\n </div>\n <div className=\"p-2 bg-muted\">\n <span className=\"text-muted-foreground\">Timestamp:</span>\n <p className=\"font-mono truncate\">{String(parsedEvent.timestamp ?? 'N/A')}</p>\n </div>\n <div className=\"p-2 bg-muted\">\n <span className=\"text-muted-foreground\">Status:</span>\n <p className=\"font-medium\">{String((parsedEvent.data as Record<string, unknown>)?.status ?? 'N/A')}</p>\n </div>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Full Data</label>\n <pre className=\"text-xs bg-muted p-3 overflow-x-auto max-h-48\">\n {JSON.stringify(parsedEvent, null, 2)}\n </pre>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Event Log */}\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h3 className=\"font-semibold\">Event Log</h3>\n <p className=\"text-xs text-muted-foreground\">History of generated webhook events</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <select\n value={eventLogFilter}\n onChange={(e) => setEventLogFilter(e.target.value as 'all' | 'deposit' | 'payout' | 'refund')}\n className=\"h-8 px-2 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n <option value=\"all\">All</option>\n <option value=\"deposit\">Deposits</option>\n <option value=\"payout\">Payouts</option>\n <option value=\"refund\">Refunds</option>\n </select>\n {webhookEvents.length > 0 && (\n <button\n onClick={() => setWebhookEvents([])}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Clear\n </button>\n )}\n </div>\n </div>\n\n <div className=\"divide-y divide-border max-h-64 overflow-y-auto\">\n {webhookEvents\n .filter((event) => eventLogFilter === 'all' || event.eventType.startsWith(eventLogFilter))\n .length === 0 ? (\n <div className=\"p-4 text-center text-muted-foreground text-xs\">\n No events yet. Generate a webhook event to see it here.\n </div>\n ) : (\n webhookEvents\n .filter((event) => eventLogFilter === 'all' || event.eventType.startsWith(eventLogFilter))\n .map((event) => (\n <div key={event.id} className=\"py-3 space-y-1\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className={`px-1.5 py-0.5 text-xs font-medium ${\n event.eventType.includes('completed') ? 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200' :\n event.eventType.includes('failed') ? 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200' :\n 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200'\n }`}>\n {event.eventType}\n </span>\n </div>\n <span className=\"text-xs text-muted-foreground\">{event.receivedAt}</span>\n </div>\n <div className=\"text-xs text-muted-foreground font-mono truncate\">\n sig: {event.signature.slice(0, 32)}...\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Results Panel */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-semibold\">Results</h3>\n {results.length > 0 && (\n <button\n onClick={() => setResults([])}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Clear\n </button>\n )}\n </div>\n\n <div className=\"border border-border bg-background divide-y divide-border max-h-[600px] overflow-y-auto\">\n {results.length === 0 ? (\n <div className=\"p-6 text-center text-muted-foreground text-xs\">\n No results yet. Execute an operation to see results here.\n </div>\n ) : (\n results.map((result) => (\n <div key={result.id} className=\"p-4 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {result.status === 'success' ? (\n <CheckIcon className=\"text-green-600\" />\n ) : (\n <XIcon className=\"text-red-600\" />\n )}\n <span className=\"font-medium text-sm\">{result.operation}</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">{result.timestamp}</span>\n </div>\n\n {result.error ? (\n <p className=\"text-xs text-red-600\">{result.error}</p>\n ) : (\n <pre className=\"text-xs bg-muted p-2 overflow-x-auto max-h-48\">\n {JSON.stringify(result.response, null, 2)}\n </pre>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// Simple SVG Icons (no external dependencies)\nconst SettingsIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst WalletIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z\" />\n </svg>\n);\n\nconst PhoneIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n);\n\nconst RefreshIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n);\n\nconst LoaderIcon = () => (\n <svg className=\"w-4 h-4 animate-spin\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n);\n\nconst CopyIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n);\n\nconst CheckIcon = ({ className = '' }: { className?: string }) => (\n <svg className={`w-4 h-4 ${className}`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst XIcon = ({ className = '' }: { className?: string }) => (\n <svg className={`w-4 h-4 ${className}`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst BeakerIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\" />\n </svg>\n);\n\nconst ToolkitIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n);\n\nconst ChartIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\" />\n </svg>\n);\n\nconst SearchIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n);\n\nconst SignalIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8.111 16.404a5.5 5.5 0 017.778 0M12 20h.01m-7.08-7.071c3.904-3.905 10.236-3.905 14.141 0M1.394 9.393c5.857-5.857 15.355-5.857 21.213 0\" />\n </svg>\n);\n\nconst KeyIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z\" />\n </svg>\n);\n\nconst WebhookIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n);\n\nconst ShieldIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" />\n </svg>\n);\n\nconst CodeIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n);\n\nexport default PawapayTestDashboard;\n"]}
|