@provable-games/budokan-sdk 0.1.26 → 0.1.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/index.ts","../src/utils/retry.ts","../src/api/base.ts","../src/utils/mappers.ts","../src/phase/index.ts","../src/api/tournaments.ts","../src/utils/address.ts","../src/api/games.ts","../src/api/activity.ts","../src/ws/manager.ts","../src/chains/constants.ts","../src/datasource/health.ts","../src/datasource/resolver.ts","../src/rpc/provider.ts","../src/rpc/viewer.ts","../src/rpc/abis/budokanViewer.json","../src/rpc/abis/budokan.json","../src/rpc/budokan.ts","../src/client.ts","../src/utils/prizes.ts","../src/games/whitelist.ts","../src/calldata/index.ts","../src/distribution/index.ts","../src/rewards/index.ts","../src/extensions/index.ts"],"names":["fetchOpts","num","CairoCustomEnum","wrapRpcCall","CallData","uint256","byteArray","CairoOption","CairoOptionVariant","hash","claimKey","getExtensionAddresses"],"mappings":"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","file":"index.cjs","sourcesContent":["export class BudokanError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BudokanError\";\n }\n}\n\nexport class BudokanApiError extends BudokanError {\n readonly status: number;\n readonly statusText: string;\n\n constructor(message: string, status: number, statusText: string = \"\") {\n super(message);\n this.name = \"BudokanApiError\";\n this.status = status;\n this.statusText = statusText;\n }\n}\n\nexport class BudokanTimeoutError extends BudokanError {\n constructor(message = \"Request timed out\") {\n super(message);\n this.name = \"BudokanTimeoutError\";\n }\n}\n\nexport class BudokanConnectionError extends BudokanError {\n constructor(message = \"Connection failed\") {\n super(message);\n this.name = \"BudokanConnectionError\";\n }\n}\n\nexport class TournamentNotFoundError extends BudokanError {\n readonly tournamentId: string;\n\n constructor(tournamentId: string) {\n super(`Tournament not found: ${tournamentId}`);\n this.name = \"TournamentNotFoundError\";\n this.tournamentId = tournamentId;\n }\n}\n\nexport class RpcError extends BudokanError {\n readonly contractAddress?: string;\n\n constructor(message: string, contractAddress?: string) {\n super(message);\n this.name = \"RpcError\";\n this.contractAddress = contractAddress;\n }\n}\n\nexport class DataSourceError extends BudokanError {\n readonly primaryError: Error;\n readonly fallbackError: Error;\n\n constructor(primaryError: Error, fallbackError: Error) {\n super(`Both data sources failed. Primary: ${primaryError.message}. Fallback: ${fallbackError.message}`);\n this.name = \"DataSourceError\";\n this.primaryError = primaryError;\n this.fallbackError = fallbackError;\n }\n}\n\nexport function isNonRetryableError(error: unknown): boolean {\n if (error instanceof TournamentNotFoundError) return true;\n if (error instanceof BudokanApiError && error.status >= 400 && error.status < 500 && error.status !== 429) {\n return true;\n }\n return false;\n}\n","import { isNonRetryableError, BudokanTimeoutError } from \"../errors/index.js\";\n\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number,\n maxDelay: number,\n): number {\n let delay = baseDelay * Math.pow(2, attempt);\n if (delay > maxDelay) delay = maxDelay;\n const minDelay = delay / 2;\n const jitter = Math.random() * (delay - minDelay);\n return minDelay + jitter;\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n attempts: number = 3,\n delay: number = 1000,\n): Promise<T> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (isNonRetryableError(error)) {\n throw error;\n }\n\n if (attempt === attempts - 1) break;\n\n const backoff = calculateBackoff(attempt, delay, delay * 8);\n await sleep(backoff);\n }\n }\n\n throw lastError ?? new BudokanTimeoutError(\"Unknown error after retries\");\n}\n","import { BudokanApiError, BudokanTimeoutError, BudokanConnectionError } from \"../errors/index.js\";\nimport { withRetry } from \"../utils/retry.js\";\n\nexport interface ApiFetchOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: unknown;\n signal?: AbortSignal;\n timeout?: number;\n retryAttempts?: number;\n retryDelay?: number;\n}\n\nconst DEFAULT_TIMEOUT = 10_000;\nconst DEFAULT_RETRY_ATTEMPTS = 3;\nconst DEFAULT_RETRY_DELAY = 1000;\n\n/**\n * Fetch JSON from an API endpoint with retry logic, timeout, and error handling.\n */\nexport async function apiFetch<T>(url: string, options: ApiFetchOptions = {}): Promise<T> {\n const {\n method = \"GET\",\n headers = {},\n body,\n signal,\n timeout = DEFAULT_TIMEOUT,\n retryAttempts = DEFAULT_RETRY_ATTEMPTS,\n retryDelay = DEFAULT_RETRY_DELAY,\n } = options;\n\n return withRetry(\n async () => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n // Link external signal\n if (signal) {\n if (signal.aborted) {\n clearTimeout(timeoutId);\n throw new BudokanTimeoutError(\"Request was aborted\");\n }\n signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({}));\n throw new BudokanApiError(\n (errorBody as Record<string, string>).error ?? `API error: ${response.status}`,\n response.status,\n response.statusText,\n );\n }\n\n return (await response.json()) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof BudokanApiError) {\n throw error;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n if (signal?.aborted) throw new BudokanTimeoutError(\"Request was aborted\");\n throw new BudokanTimeoutError();\n }\n throw new BudokanConnectionError(\n error instanceof Error ? error.message : \"Connection failed\",\n );\n }\n },\n retryAttempts,\n retryDelay,\n );\n}\n\n/**\n * Extract pagination from API response.\n * The API wraps pagination in a `pagination` object, but the SDK\n * PaginatedResult type uses flat fields (total, limit, offset).\n */\nexport function extractPagination(result: Record<string, unknown>, defaults?: { limit?: number; offset?: number }): {\n total: number | undefined;\n limit: number;\n offset: number;\n} {\n const pagination = result.pagination as { total?: number; limit?: number; offset?: number } | undefined;\n return {\n total: pagination?.total ?? (result.total as number | undefined),\n limit: pagination?.limit ?? (result.limit as number | undefined) ?? defaults?.limit ?? 50,\n offset: pagination?.offset ?? (result.offset as number | undefined) ?? defaults?.offset ?? 0,\n };\n}\n\n/**\n * Build a query string from a record of key-value pairs.\n * Undefined and null values are omitted.\n */\nexport function buildQueryString(params: Record<string, string | number | boolean | undefined | null>): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n qs.set(key, String(value));\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n","/**\n * Convert a snake_case string to camelCase.\n */\nfunction toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\n/**\n * Convert a camelCase string to snake_case.\n */\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Deeply convert all keys in an object from snake_case to camelCase.\n */\nexport function snakeToCamel<T>(obj: unknown): T {\n if (Array.isArray(obj)) {\n return obj.map((item) => snakeToCamel(item)) as T;\n }\n if (obj !== null && typeof obj === \"object\" && !(obj instanceof Date)) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[toCamelCase(key)] = snakeToCamel(value);\n }\n return result as T;\n }\n return obj as T;\n}\n\n/**\n * Deeply convert all keys in an object from camelCase to snake_case.\n */\nexport function camelToSnake<T>(obj: unknown): T {\n if (Array.isArray(obj)) {\n return obj.map((item) => camelToSnake(item)) as T;\n }\n if (obj !== null && typeof obj === \"object\" && !(obj instanceof Date)) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[toSnakeCase(key)] = camelToSnake(value);\n }\n return result as T;\n }\n return obj as T;\n}\n","/**\n * Tournament phase derivation — the single source of truth for \"what phase is\n * this tournament in right now?\", mirroring the contract exactly\n * (`packages/budokan/src/libs/schedule.cairo::current_phase`).\n *\n * The client used to recompute this inline (`isStarted/isEnded/isSubmitted`);\n * this generalizes it so the client, bot, and any integration agree with the\n * chain on phase boundaries (all comparisons are strict `<`, so a boundary\n * second belongs to the *later* phase, matching the Cairo `if` ladder).\n */\n\nimport type { Phase } from \"../types/tournament.js\";\n\n/** Minimal schedule + creation-time shape needed to derive a phase. Matches\n * the relevant subset of `Tournament` (top-level delay fields + on-chain\n * created-at), so a full `Tournament` satisfies it directly. */\nexport interface PhaseInput {\n /** Unix seconds (string or number) the tournament was created on-chain. */\n createdAtOnchain?: string | number | null;\n registrationStartDelay?: number | null;\n registrationEndDelay?: number | null;\n gameStartDelay?: number | null;\n gameEndDelay?: number | null;\n submissionDuration?: number | null;\n /** Fallback structured schedule (used when top-level delays are absent). */\n schedule?: {\n registrationStartDelay: number;\n registrationEndDelay: number;\n gameStartDelay: number;\n gameEndDelay: number;\n submissionDuration: number;\n } | null;\n}\n\n/**\n * Derive the current {@link Phase}. Returns `null` when the on-chain\n * creation time is unknown (can't anchor the schedule).\n *\n * @param t - tournament schedule + `createdAtOnchain`\n * @param nowSeconds - Unix seconds to evaluate at (defaults to wall-clock now).\n * Pass an explicit value for deterministic/testable derivation.\n */\nexport function tournamentPhase(\n t: PhaseInput,\n nowSeconds?: number,\n): Phase | null {\n const createdAt = Number(t.createdAtOnchain ?? NaN);\n if (!Number.isFinite(createdAt)) return null;\n\n const regStartDelay = Number(t.registrationStartDelay ?? t.schedule?.registrationStartDelay ?? 0);\n const regEndDelay = Number(t.registrationEndDelay ?? t.schedule?.registrationEndDelay ?? 0);\n const gameStartDelay = Number(t.gameStartDelay ?? t.schedule?.gameStartDelay ?? 0);\n const gameEndDelay = Number(t.gameEndDelay ?? t.schedule?.gameEndDelay ?? 0);\n const submissionDuration = Number(t.submissionDuration ?? t.schedule?.submissionDuration ?? 0);\n\n const now = nowSeconds ?? Math.floor(Date.now() / 1000);\n\n // Registration exists when either delay is non-zero (contract: has_registration).\n const hasReg = regStartDelay > 0 || regEndDelay > 0;\n const regStart = createdAt + regStartDelay;\n const regEnd = regStart + regEndDelay;\n const gameStart = createdAt + gameStartDelay;\n const gameEnd = gameStart + gameEndDelay;\n const subEnd = gameEnd + submissionDuration;\n\n if (hasReg && now < regStart) return \"scheduled\";\n if (hasReg && now < regEnd) return \"registration\";\n if (now < gameStart) return \"staging\";\n if (now < gameEnd) return \"live\";\n if (now < subEnd) return \"submission\";\n return \"finalized\";\n}\n","import type { Tournament, TournamentListParams, QualificationEntry } from \"../types/tournament.js\";\nimport type { Registration } from \"../types/registration.js\";\nimport type { Prize, RewardClaim, RewardClaimSummary, PrizeAggregation } from \"../types/prize.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport { apiFetch, buildQueryString, extractPagination } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\nimport { tournamentPhase } from \"../phase/index.js\";\n\n/** Normalize tournament: ensure both `id` and `tournamentId` exist */\nfunction normalizeTournament(raw: Record<string, unknown>): Tournament {\n const t = snakeToCamel<Tournament & { id?: string }>(raw);\n // API returns `id`, SDK type uses `tournamentId` — keep both in sync\n const id = t.id ?? t.tournamentId;\n // The protocol-fee share is carried on the entry fee object by the API; lift\n // it to the top level so consumers get it typed (top-level wins if present).\n const protocolFeeShare =\n t.protocolFeeShare ??\n (t.entryFee as { protocolFeeShare?: number } | null)?.protocolFeeShare ??\n null;\n // Derive the lifecycle phase at read time (the API doesn't return it).\n const phase = t.phase ?? tournamentPhase(t);\n return { ...t, id, tournamentId: id, protocolFeeShare, phase };\n}\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch a paginated list of tournaments.\n */\nexport async function getTournaments(\n baseUrl: string,\n params?: TournamentListParams,\n ctx?: ApiContext,\n): Promise<PaginatedResult<Tournament>> {\n const qs = buildQueryString({\n game_address: params?.gameAddress,\n creator: params?.creator,\n phase: params?.phase,\n limit: params?.limit,\n offset: params?.offset,\n sort: params?.sort,\n from_id: params?.fromId,\n exclude_ids: params?.excludeIds?.join(\",\"),\n tournament_ids: params?.tournamentIds?.join(\",\"),\n whitelisted_extensions: params?.whitelistedExtensions?.join(\",\"),\n include_prizes: params?.includePrizeSummary,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => normalizeTournament(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch a single tournament by ID.\n */\nexport async function getTournament(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<Tournament> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/tournaments/${tournamentId}`,\n fetchOpts(ctx),\n );\n return normalizeTournament(result.data);\n}\n\n/**\n * Fetch registrations for a tournament.\n *\n * No `playerAddress` filter: registrations are keyed by token id, and\n * the original registrant goes stale on transfer. Callers wanting \"the\n * current user's registrations\" should resolve their owned token ids via\n * denshokan-sdk's useTokens and pass them as `gameTokenIds`.\n */\nexport async function getTournamentRegistrations(\n baseUrl: string,\n tournamentId: string,\n params?: { gameTokenIds?: string[]; hasSubmitted?: boolean; isBanned?: boolean; limit?: number; offset?: number },\n ctx?: ApiContext,\n): Promise<PaginatedResult<Registration>> {\n const qs = buildQueryString({\n game_token_ids: params?.gameTokenIds?.length ? params.gameTokenIds.join(\",\") : undefined,\n has_submitted: params?.hasSubmitted,\n is_banned: params?.isBanned,\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments/${tournamentId}/registrations${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<Registration>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch prizes for a tournament.\n */\nexport async function getTournamentPrizes(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<Prize[]> {\n const result = await apiFetch<{ data: Record<string, unknown>[] }>(\n `${baseUrl}/tournaments/${tournamentId}/prizes`,\n fetchOpts(ctx),\n );\n return result.data.map((item) => snakeToCamel<Prize>(item));\n}\n\n/**\n * Fetch reward claims for a tournament.\n */\nexport async function getTournamentRewardClaims(\n baseUrl: string,\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ctx?: ApiContext,\n): Promise<PaginatedResult<RewardClaim>> {\n const qs = buildQueryString({\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments/${tournamentId}/reward-claims${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<RewardClaim>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch reward claims summary for a tournament.\n */\nexport async function getTournamentRewardClaimsSummary(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<RewardClaimSummary> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/tournaments/${tournamentId}/reward-claims/summary`,\n fetchOpts(ctx),\n );\n return snakeToCamel<RewardClaimSummary>(result.data);\n}\n\n/**\n * Fetch qualifications for a tournament.\n */\nexport async function getTournamentQualifications(\n baseUrl: string,\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ctx?: ApiContext,\n): Promise<PaginatedResult<QualificationEntry>> {\n const qs = buildQueryString({\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments/${tournamentId}/qualifications${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<QualificationEntry>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch prize aggregation for a tournament.\n */\nexport async function getTournamentPrizeAggregation(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<PrizeAggregation[]> {\n const qs = buildQueryString({ include_aggregation: true });\n const result = await apiFetch<{ data: Record<string, unknown>[] }>(\n `${baseUrl}/tournaments/${tournamentId}/prizes${qs}`,\n fetchOpts(ctx),\n );\n return result.data.map((item) => snakeToCamel<PrizeAggregation>(item));\n}\n","/**\n * Normalize a Starknet address to a 0x-prefixed, 66-character lowercase hex string.\n */\nexport function normalizeAddress(address: string): string {\n const stripped = address.replace(/^0x0*/i, \"\");\n return (\"0x\" + stripped.padStart(64, \"0\")).toLowerCase();\n}\n","import type { Tournament, TournamentListParams } from \"../types/tournament.js\";\nimport type { PlatformStats } from \"../types/activity.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport { apiFetch, buildQueryString, extractPagination } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\nimport { normalizeAddress } from \"../utils/address.js\";\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch tournaments for a specific game.\n */\nexport async function getGameTournaments(\n baseUrl: string,\n gameAddress: string,\n params?: Omit<TournamentListParams, \"gameAddress\">,\n ctx?: ApiContext,\n): Promise<PaginatedResult<Tournament>> {\n const normalized = normalizeAddress(gameAddress);\n const qs = buildQueryString({\n creator: params?.creator,\n phase: params?.phase,\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/games/${normalized}/tournaments${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<Tournament>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch tournament stats for a specific game.\n */\nexport async function getGameStats(\n baseUrl: string,\n gameAddress: string,\n ctx?: ApiContext,\n): Promise<PlatformStats> {\n const normalized = normalizeAddress(gameAddress);\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/games/${normalized}/stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PlatformStats>(result.data);\n}\n","import type { PlatformStats, PrizeStats } from \"../types/activity.js\";\nimport { apiFetch } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch platform-wide activity stats.\n */\nexport async function getActivityStats(\n baseUrl: string,\n ctx?: ApiContext,\n): Promise<PlatformStats> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/activity/stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PlatformStats>(result.data);\n}\n\n/**\n * Fetch platform-wide prize stats.\n */\nexport async function getPrizeStats(\n baseUrl: string,\n ctx?: ApiContext,\n): Promise<PrizeStats> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/activity/prize-stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PrizeStats>(result.data);\n}\n","import type { WSSubscribeOptions, WSEventHandler, WSEventMessage } from \"../types/websocket.js\";\n\ninterface WSManagerConfig {\n maxReconnectAttempts: number;\n reconnectBaseDelay: number;\n}\n\nconst DEFAULT_WS_CONFIG: WSManagerConfig = {\n maxReconnectAttempts: 10,\n reconnectBaseDelay: 1000,\n};\n\n/**\n * WebSocket manager with auto-reconnect and subscription management.\n */\nexport class WSManager {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly config: WSManagerConfig;\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private subscriptions = new Map<string, { options: WSSubscribeOptions; handler: WSEventHandler }>();\n private nextSubId = 1;\n private connected = false;\n private connectionListeners = new Set<(connected: boolean) => void>();\n\n constructor(wsUrl: string, config?: Partial<WSManagerConfig>) {\n this.wsUrl = wsUrl;\n this.config = { ...DEFAULT_WS_CONFIG, ...config };\n }\n\n /**\n * Open a WebSocket connection. No-op if already connected.\n */\n connect(): void {\n if (this.ws) return;\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.notifyConnectionChange(true);\n // Re-subscribe all active subscriptions\n for (const [, sub] of this.subscriptions) {\n this.sendSubscribe(sub.options);\n }\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data as string) as WSEventMessage;\n if (message.type === \"event\") {\n for (const [, sub] of this.subscriptions) {\n sub.handler(message);\n }\n }\n } catch {\n // Ignore malformed messages\n }\n };\n\n this.ws.onclose = () => {\n this.connected = false;\n this.notifyConnectionChange(false);\n this.ws = null;\n this.attemptReconnect();\n };\n\n this.ws.onerror = () => {\n // onclose will fire after onerror\n };\n } catch {\n this.attemptReconnect();\n }\n }\n\n /**\n * Close the WebSocket connection and stop reconnecting.\n */\n disconnect(): void {\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n if (this.ws) {\n this.ws.onclose = null;\n this.ws.close();\n this.ws = null;\n }\n this.connected = false;\n this.notifyConnectionChange(false);\n this.reconnectAttempts = 0;\n }\n\n /**\n * Subscribe to channels with an optional tournament filter.\n * Returns an unsubscribe function.\n */\n subscribe(options: WSSubscribeOptions, handler: WSEventHandler): () => void {\n const id = String(this.nextSubId++);\n this.subscriptions.set(id, { options, handler });\n\n if (this.connected) {\n this.sendSubscribe(options);\n }\n\n return () => {\n this.subscriptions.delete(id);\n if (this.connected && this.ws) {\n this.ws.send(JSON.stringify({\n type: \"unsubscribe\",\n channels: options.channels,\n }));\n }\n };\n }\n\n /**\n * Register a callback for a single message. Convenience wrapper around subscribe.\n * Returns an unsubscribe function.\n */\n onMessage(callback: WSEventHandler): () => void {\n const id = String(this.nextSubId++);\n // Subscribe to all channels by using a passthrough handler\n this.subscriptions.set(id, {\n options: { channels: [] },\n handler: callback,\n });\n\n return () => {\n this.subscriptions.delete(id);\n };\n }\n\n /**\n * Whether the WebSocket is currently connected.\n */\n get isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Register a listener for connection state changes.\n * Returns an unsubscribe function.\n */\n onConnectionChange(listener: (connected: boolean) => void): () => void {\n this.connectionListeners.add(listener);\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n\n private notifyConnectionChange(isConnected: boolean): void {\n for (const listener of this.connectionListeners) {\n try {\n listener(isConnected);\n } catch {\n // Ignore listener errors\n }\n }\n }\n\n private sendSubscribe(options: WSSubscribeOptions): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n if (options.channels.length === 0) return;\n this.ws.send(JSON.stringify({\n type: \"subscribe\",\n channels: options.channels,\n tournamentIds: options.tournamentIds,\n }));\n }\n\n private attemptReconnect(): void {\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) return;\n if (this.subscriptions.size === 0) return;\n\n const delay = this.config.reconnectBaseDelay * Math.pow(2, this.reconnectAttempts);\n this.reconnectAttempts++;\n\n this.reconnectTimeout = setTimeout(() => {\n this.connect();\n }, Math.min(delay, 30_000));\n }\n}\n","export interface ChainConfig {\n rpcUrl: string;\n apiBaseUrl: string;\n wsUrl: string;\n budokanAddress: string;\n viewerAddress: string;\n}\n\nexport const CHAINS: Record<string, ChainConfig> = {\n mainnet: {\n rpcUrl: \"https://rpc.provable.games/rpc\",\n apiBaseUrl: \"https://budokan-api-production.up.railway.app\",\n wsUrl: \"wss://budokan-api-production.up.railway.app/ws\",\n budokanAddress: \"0x0596ced030e74ebc37f33607f07ecd5a62eff22cdc4ae31fe2d724040c1bdc0b\",\n viewerAddress: \"0x013c8239361fdbd7ec26db2c83f4ff270c5bba83a0bc105b4005b676ff57fdbe\",\n },\n sepolia: {\n rpcUrl: \"https://api.cartridge.gg/x/starknet/sepolia/rpc/v0_10\",\n apiBaseUrl: \"https://budokan-api-sepolia.up.railway.app\",\n wsUrl: \"wss://budokan-api-sepolia.up.railway.app/ws\",\n budokanAddress: \"0x074cc823c382d98e6b8d657aa86776a57d85e1dc2912d54d83a4fef147472683\",\n // Redeployed 2026-06-18 to match the upgraded #264/#269 budokan class —\n // the prior viewer (0x03da56…) was built against the old budokan interface\n // (called the removed `tournament_entries`) and reverted RPC reads.\n viewerAddress: \"0x06b2773d5f1f8bfa5aa3b698fbbaea0472b30af003ea6058330ed52a1acaa283\",\n },\n} as const;\n\nexport function getChainConfig(chain: string): ChainConfig | undefined {\n return CHAINS[chain];\n}\n\n/**\n * Voyager block-explorer base URL for the chain. Used to build\n * shareable links for tx hashes and contracts in chat / Discord / CLI\n * surfaces. Unknown chains fall back to mainnet — Voyager 404s\n * gracefully and the caller can still click the link.\n */\nexport function explorerBaseUrl(chain: string): string {\n if (chain === \"sepolia\") return \"https://sepolia.voyager.online\";\n return \"https://voyager.online\";\n}\n\n/** Voyager URL for a transaction hash. */\nexport function explorerTxUrl(chain: string, txHash: string): string {\n return `${explorerBaseUrl(chain)}/tx/${txHash}`;\n}\n\n/** Voyager URL for a contract / account address. */\nexport function explorerAddressUrl(chain: string, address: string): string {\n return `${explorerBaseUrl(chain)}/contract/${address}`;\n}\n\n/**\n * Canonical budokan.gg URL for a tournament. The `network` query param\n * tells the client which chain to load — important when sharing sepolia\n * tournaments since the site defaults to mainnet.\n */\nexport function tournamentPageUrl(\n chain: string,\n // u64 on-chain — accept bigint/string losslessly (parseTournamentIdFromReceipt\n // returns bigint). number is allowed for convenience.\n tournamentId: string | number | bigint,\n): string {\n return `https://budokan.gg/tournament/${tournamentId}?network=${chain}`;\n}\n","export type ConnectionMode = \"api\" | \"rpc-fallback\" | \"offline\";\n\nexport interface ServiceStatus {\n available: boolean;\n lastChecked: number;\n latency: number | null;\n error: string | null;\n}\n\nexport interface ConnectionStatusState {\n api: ServiceStatus;\n rpc: ServiceStatus;\n mode: ConnectionMode;\n initialCheckComplete: boolean;\n}\n\ntype StatusListener = (status: ConnectionStatusState) => void;\n\nexport interface HealthTimingConfig {\n initialCheckDelay?: number;\n checkInterval?: number;\n checkTimeout?: number;\n}\n\nexport class ConnectionStatus {\n private status: ConnectionStatusState = {\n api: { available: true, lastChecked: 0, latency: null, error: null },\n rpc: { available: true, lastChecked: 0, latency: null, error: null },\n mode: \"api\",\n initialCheckComplete: false,\n };\n\n private listeners = new Set<StatusListener>();\n private checkInterval: ReturnType<typeof setInterval> | null = null;\n private initialCheckTimeout: ReturnType<typeof setTimeout> | null = null;\n private apiUrl: string;\n private rpcUrl: string;\n private readonly initialCheckDelay: number;\n private readonly checkIntervalMs: number;\n private readonly checkTimeoutMs: number;\n\n constructor(apiUrl: string, rpcUrl: string, config?: HealthTimingConfig) {\n this.apiUrl = apiUrl;\n this.rpcUrl = rpcUrl;\n this.initialCheckDelay = Math.max(config?.initialCheckDelay ?? 1_000, 100);\n this.checkIntervalMs = Math.max(config?.checkInterval ?? 30_000, 1_000);\n this.checkTimeoutMs = Math.max(config?.checkTimeout ?? 5_000, 1_000);\n }\n\n getStatus(): ConnectionStatusState {\n return { ...this.status };\n }\n\n get mode(): ConnectionMode {\n return this.status.mode;\n }\n\n subscribe(listener: StatusListener): () => void {\n this.listeners.add(listener);\n listener(this.status);\n return () => { this.listeners.delete(listener); };\n }\n\n startMonitoring(): void {\n if (this.checkInterval) return;\n this.initialCheckTimeout = setTimeout(() => {\n this.performHealthCheck();\n this.checkInterval = setInterval(() => this.performHealthCheck(), this.checkIntervalMs);\n }, this.initialCheckDelay);\n }\n\n stopMonitoring(): void {\n if (this.checkInterval) {\n clearInterval(this.checkInterval);\n this.checkInterval = null;\n }\n if (this.initialCheckTimeout) {\n clearTimeout(this.initialCheckTimeout);\n this.initialCheckTimeout = null;\n }\n }\n\n markApiUnavailable(error?: string): void {\n this.updateStatus({\n api: { ...this.status.api, available: false, lastChecked: Date.now(), error: error || \"Request failed\" },\n });\n }\n\n markRpcUnavailable(error?: string): void {\n this.updateStatus({\n rpc: { ...this.status.rpc, available: false, lastChecked: Date.now(), error: error || \"Request failed\" },\n });\n }\n\n async checkNow(): Promise<void> {\n await this.performHealthCheck();\n }\n\n destroy(): void {\n this.stopMonitoring();\n this.listeners.clear();\n }\n\n private async performHealthCheck(): Promise<void> {\n const [apiResult, rpcResult] = await Promise.all([\n this.checkApi(),\n this.checkRpc(),\n ]);\n this.updateStatus({ api: apiResult, rpc: rpcResult, initialCheckComplete: true });\n }\n\n private async checkApi(): Promise<ServiceStatus> {\n const startTime = Date.now();\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.checkTimeoutMs);\n const response = await fetch(`${this.apiUrl}/health`, { signal: controller.signal });\n clearTimeout(timeoutId);\n const latency = Date.now() - startTime;\n if (!response.ok) {\n return { available: false, lastChecked: Date.now(), latency, error: `HTTP ${response.status}` };\n }\n const data = await response.json() as Record<string, unknown>;\n const isAvailable = data.status === \"healthy\" || data.status === \"degraded\";\n return { available: isAvailable, lastChecked: Date.now(), latency, error: isAvailable ? null : `API status: ${data.status}` };\n } catch (error) {\n return { available: false, lastChecked: Date.now(), latency: null, error: error instanceof Error ? error.message : \"Network error\" };\n }\n }\n\n private async checkRpc(): Promise<ServiceStatus> {\n const startTime = Date.now();\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.checkTimeoutMs);\n const response = await fetch(this.rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", method: \"starknet_chainId\", params: [], id: 1 }),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n const latency = Date.now() - startTime;\n if (!response.ok) {\n return { available: false, lastChecked: Date.now(), latency, error: `HTTP ${response.status}` };\n }\n const data = await response.json() as Record<string, unknown>;\n const isHealthy = data.result !== undefined && !data.error;\n return { available: isHealthy, lastChecked: Date.now(), latency, error: isHealthy ? null : \"RPC error\" };\n } catch (error) {\n return { available: false, lastChecked: Date.now(), latency: null, error: error instanceof Error ? error.message : \"Network error\" };\n }\n }\n\n private updateStatus(partial: Partial<ConnectionStatusState>): void {\n const newStatus = { ...this.status, ...partial };\n\n if (newStatus.api.available) {\n newStatus.mode = \"api\";\n } else if (newStatus.rpc.available) {\n newStatus.mode = \"rpc-fallback\";\n } else {\n newStatus.mode = \"offline\";\n }\n\n const changed =\n this.status.api.available !== newStatus.api.available ||\n this.status.rpc.available !== newStatus.rpc.available ||\n this.status.mode !== newStatus.mode ||\n this.status.initialCheckComplete !== newStatus.initialCheckComplete;\n\n this.status = newStatus;\n\n if (changed) {\n this.listeners.forEach((listener) => {\n try { listener(this.status); } catch { /* ignore */ }\n });\n }\n }\n}\n","import type { ConnectionStatus } from \"./health.js\";\nimport { DataSourceError } from \"../errors/index.js\";\n\nexport async function withFallback<T>(\n primary: () => Promise<T>,\n fallback: () => Promise<T>,\n health?: ConnectionStatus,\n): Promise<T> {\n // If health monitoring shows primary source is down, skip it\n if (health) {\n const mode = health.mode;\n if (mode === \"rpc-fallback\") {\n // API is known-down, go straight to RPC fallback\n try {\n return await fallback();\n } catch (fallbackError) {\n throw fallbackError;\n }\n }\n\n if (mode === \"offline\") {\n // Both are known-down, still try both in order\n }\n }\n\n let primaryError: Error;\n try {\n return await primary();\n } catch (error) {\n primaryError = error as Error;\n // Report failure to health service\n if (health) {\n health.markApiUnavailable(primaryError.message);\n }\n }\n\n try {\n return await fallback();\n } catch (fallbackError) {\n if (health) {\n health.markRpcUnavailable((fallbackError as Error).message);\n }\n throw new DataSourceError(primaryError, fallbackError as Error);\n }\n}\n","import type { RpcProvider, Contract, Abi } from \"starknet\";\n\nlet starknetModule: typeof import(\"starknet\") | null = null;\n\nasync function getStarknet(): Promise<typeof import(\"starknet\")> {\n if (!starknetModule) {\n starknetModule = await import(\"starknet\");\n }\n return starknetModule;\n}\n\nexport async function createProvider(\n rpcUrl: string,\n headers?: Record<string, string>,\n): Promise<RpcProvider> {\n const { RpcProvider: StarknetRpcProvider } = await getStarknet();\n const provider = new StarknetRpcProvider({\n nodeUrl: rpcUrl,\n ...(headers && { headers }),\n });\n return provider;\n}\n\nexport async function createContract(\n abi: Abi,\n address: string,\n provider: RpcProvider,\n): Promise<Contract> {\n // Handle case where ABI might be wrapped in a default export\n let resolvedAbi: Abi = abi;\n if (abi && !Array.isArray(abi) && typeof abi === \"object\" && \"default\" in abi) {\n resolvedAbi = (abi as { default: Abi }).default;\n }\n\n const starknet = await getStarknet();\n\n return new starknet.Contract({ abi: resolvedAbi, address, providerOrAccount: provider });\n}\n","import type { Contract } from \"starknet\";\nimport { CairoCustomEnum } from \"starknet\";\nimport type { Tournament } from \"../types/tournament.js\";\nimport type { EntryRequirement, Distribution } from \"@provable-games/metagame-sdk\";\nimport type { LeaderboardEntry } from \"../types/leaderboard.js\";\nimport type { Registration } from \"../types/registration.js\";\nimport type { Prize } from \"../types/prize.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport type { Phase } from \"../types/tournament.js\";\nimport { RpcError } from \"../errors/index.js\";\nimport { tournamentPhase } from \"../phase/index.js\";\nimport { num } from \"starknet\";\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\nfunction wrapRpcCall<T>(fn: () => Promise<T>, contractAddress?: string): Promise<T> {\n return fn().catch((error: unknown) => {\n throw new RpcError(\n error instanceof Error ? error.message : \"RPC call failed\",\n contractAddress,\n );\n });\n}\n\nfunction decodeShortString(value: unknown): string {\n if (!value) return \"\";\n const hex = num.toHex(value as bigint);\n if (hex === \"0x0\") return \"\";\n const hexStr = hex.slice(2);\n let result = \"\";\n for (let i = 0; i < hexStr.length; i += 2) {\n const charCode = parseInt(hexStr.slice(i, i + 2), 16);\n if (charCode === 0) break;\n result += String.fromCharCode(charCode);\n }\n return result;\n}\n\nfunction decodeByteArray(value: unknown): string {\n if (!value) return \"\";\n // ByteArray from Cairo is serialized as { data: felt252[], pending_word: felt252, pending_word_len: u32 }\n const obj = value as Record<string, unknown>;\n const data = obj.data as unknown[] | undefined;\n const pendingWord = obj.pending_word;\n const pendingWordLen = Number(obj.pending_word_len ?? 0);\n\n let result = \"\";\n\n // Each data element is a 31-byte chunk encoded as felt252\n if (data) {\n for (const chunk of data) {\n const hex = num.toHex(chunk as bigint).slice(2).padStart(62, \"0\");\n for (let i = 0; i < 62; i += 2) {\n const charCode = parseInt(hex.slice(i, i + 2), 16);\n if (charCode !== 0) result += String.fromCharCode(charCode);\n }\n }\n }\n\n // Pending word contains remaining bytes (< 31)\n if (pendingWord && pendingWordLen > 0) {\n const hex = num.toHex(pendingWord as bigint).slice(2).padStart(pendingWordLen * 2, \"0\");\n for (let i = 0; i < pendingWordLen * 2; i += 2) {\n const charCode = parseInt(hex.slice(i, i + 2), 16);\n if (charCode !== 0) result += String.fromCharCode(charCode);\n }\n }\n\n return result;\n}\n\n/** All Phase variant names for CairoCustomEnum */\nconst PHASE_VARIANTS = [\"Scheduled\", \"Registration\", \"Staging\", \"Live\", \"Submission\", \"Finalized\"] as const;\n\nconst PHASE_NAME_MAP: Record<Phase, string> = {\n scheduled: \"Scheduled\",\n registration: \"Registration\",\n staging: \"Staging\",\n live: \"Live\",\n submission: \"Submission\",\n finalized: \"Finalized\",\n};\n\n/** Convert SDK Phase string to Cairo enum argument for RPC calls */\nfunction phaseToRpcArg(phase: Phase): CairoCustomEnum {\n const activeVariant = PHASE_NAME_MAP[phase];\n const variants: Record<string, unknown> = {};\n for (const v of PHASE_VARIANTS) {\n variants[v] = v === activeVariant ? {} : undefined;\n }\n return new CairoCustomEnum(variants);\n}\n\n// =========================================================================\n// Parsers — raw on-chain structs → SDK types\n// =========================================================================\n\nfunction parseTournament(\n raw: unknown,\n entryCount: number,\n protocolFeeShare: number | null = null,\n): Tournament {\n const obj = raw as Record<string, unknown>;\n const id = String(obj.id ?? \"0\");\n const createdAt = Number(obj.created_at ?? 0);\n const createdBy = num.toHex(obj.created_by as bigint);\n const creatorTokenId = obj.creator_token_id ? num.toHex(obj.creator_token_id as bigint) : null;\n\n // Metadata\n const metadata = obj.metadata as Record<string, unknown> | undefined;\n const name = metadata ? decodeShortString(metadata.name) : \"\";\n const description = metadata ? decodeByteArray(metadata.description) : \"\";\n\n // Schedule\n const sched = obj.schedule as Record<string, unknown> | undefined;\n const registrationStartDelay = Number(sched?.registration_start_delay ?? 0);\n const registrationEndDelay = Number(sched?.registration_end_delay ?? 0);\n const gameStartDelay = Number(sched?.game_start_delay ?? 0);\n const gameEndDelay = Number(sched?.game_end_delay ?? 0);\n const submissionDuration = Number(sched?.submission_duration ?? 0);\n\n // Compute absolute timestamps (matching contract: each delay is relative to its anchor)\n const createdAtStr = String(createdAt);\n const regStart = createdAt + registrationStartDelay;\n const regEnd = regStart + registrationEndDelay;\n const gameStart = createdAt + gameStartDelay;\n const gameEnd = gameStart + gameEndDelay;\n const subEnd = gameEnd + submissionDuration;\n const registrationStartTime = String(regStart);\n const registrationEndTime = String(regEnd);\n const gameStartTime = String(gameStart);\n const gameEndTime = String(gameEnd);\n const submissionEndTime = String(subEnd);\n\n // GameConfig\n const gc = obj.game_config as Record<string, unknown> | undefined;\n const gameAddress = gc ? num.toHex(gc.game_address as bigint) : \"\";\n const settingsId = Number(gc?.settings_id ?? 0);\n const soulbound = Boolean(gc?.soulbound);\n const paymaster = Boolean(gc?.paymaster);\n const clientUrl = gc?.client_url ? decodeOptionalByteArray(gc.client_url) : null;\n const renderer = gc?.renderer ? parseOptionalAddress(gc.renderer) : null;\n\n // LeaderboardConfig\n const lc = obj.leaderboard_config as Record<string, unknown> | undefined;\n const ascending = Boolean(lc?.ascending);\n const gameMustBeOver = Boolean(lc?.game_must_be_over);\n\n // entry_fee is Option<EntryFeeKind>, where EntryFeeKind is a sum type\n // { BuiltIn: EntryFee, Extension: ExtensionConfig }. Unwrap the Option,\n // then the BuiltIn variant. Extension entry fees aren't representable in\n // the flat Tournament.entryFee shape, so they map to null (same as\n // extension prizes in parsePrize).\n const entryFeeKind = parseOption(obj.entry_fee) as\n | Record<string, unknown>\n | null;\n let entryFeeToken: string | null = null;\n let entryFeeAmount: string | null = null;\n let entryFee: Tournament[\"entryFee\"] = null;\n let entryFeeKindTag: Tournament[\"entryFeeKind\"] = null;\n let entryFeeExtension: Tournament[\"entryFeeExtension\"] = null;\n if (entryFeeKind) {\n const variantBag = (entryFeeKind.variant ?? entryFeeKind) as Record<\n string,\n unknown\n >;\n const ef = variantBag.BuiltIn as Record<string, unknown> | undefined;\n const ext = variantBag.Extension as Record<string, unknown> | undefined;\n if (ef) {\n entryFeeKindTag = \"builtin\";\n entryFeeToken = num.toHex(ef.token_address as bigint);\n entryFeeAmount = String(ef.amount ?? \"0\");\n entryFee = {\n tokenAddress: entryFeeToken,\n amount: entryFeeAmount,\n tournamentCreatorShare: Number(ef.tournament_creator_share ?? 0),\n gameCreatorShare: Number(ef.game_creator_share ?? 0),\n refundShare: Number(ef.refund_share ?? 0),\n distribution: (ef.distribution as Distribution) ?? null,\n distributionCount: Number(ef.distribution_count ?? 0),\n };\n } else if (ext) {\n // EntryFeeKind::Extension { address, config } — an external fee\n // extension. Built-in fee fields stay null; surfaced distinctly so\n // callers don't mistake it for a free tournament.\n entryFeeKindTag = \"extension\";\n entryFeeExtension = {\n address: num.toHex(ext.address as bigint),\n config: Array.isArray(ext.config)\n ? (ext.config as unknown[]).map((x) => num.toHex(x as bigint))\n : [],\n };\n }\n }\n\n // EntryRequirement (Option)\n const entryRequirement = parseOption(obj.entry_requirement) as EntryRequirement | null;\n const hasEntryRequirement = entryRequirement !== null;\n\n return {\n id,\n tournamentId: id,\n gameAddress,\n createdAt: new Date(createdAt * 1000).toISOString(),\n createdBy,\n creatorTokenId,\n name,\n description,\n registrationStartDelay,\n registrationEndDelay,\n gameStartDelay,\n gameEndDelay,\n submissionDuration,\n createdAtOnchain: createdAtStr,\n registrationStartTime,\n registrationEndTime,\n gameStartTime,\n gameEndTime,\n submissionEndTime,\n settingsId,\n soulbound,\n paymaster,\n clientUrl,\n renderer,\n leaderboardAscending: ascending,\n leaderboardGameMustBeOver: gameMustBeOver,\n entryFeeToken,\n entryFeeAmount,\n // Protocol-fee bps snapshot, surfaced by the viewer's TournamentFullState.\n protocolFeeShare,\n hasEntryRequirement,\n schedule: {\n registrationStartDelay,\n registrationEndDelay,\n gameStartDelay,\n gameEndDelay,\n submissionDuration,\n },\n gameConfig: {\n gameAddress,\n settingsId,\n soulbound,\n paymaster,\n clientUrl,\n renderer,\n },\n entryFee,\n entryFeeKind: entryFeeKindTag,\n entryFeeExtension,\n entryRequirement,\n leaderboardConfig: { ascending, gameMustBeOver },\n phase: tournamentPhase({\n createdAtOnchain: createdAtStr,\n registrationStartDelay,\n registrationEndDelay,\n gameStartDelay,\n gameEndDelay,\n submissionDuration,\n }),\n entryCount,\n prizeCount: 0, // Not available from viewer\n submissionCount: 0, // Not available from viewer\n metadata: null,\n };\n}\n\nfunction parseLeaderboardEntry(raw: unknown): LeaderboardEntry {\n const obj = raw as Record<string, unknown>;\n return {\n position: Number(obj.position ?? 0),\n tokenId: num.toHex(obj.token_id as bigint),\n };\n}\n\nfunction parseRegistration(raw: unknown, tournamentId: string): Registration {\n const obj = raw as Record<string, unknown>;\n return {\n tournamentId,\n gameTokenId: num.toHex(obj.game_token_id as bigint),\n gameAddress: \"\", // Not in on-chain struct\n entryNumber: Number(obj.entry_id ?? 0),\n hasSubmitted: Boolean(obj.has_submitted),\n isBanned: Boolean(obj.is_banned),\n };\n}\n\nfunction parsePrize(raw: unknown): Prize {\n const record = raw as Record<string, unknown>;\n\n // Unwrap PrizeRecord -> Prize sum type. starknet.js may expose the variant\n // via `activeVariant()` + `variant`, or as a flat record keyed by name.\n // Throw (rather than drop) on malformed/unknown shapes so a changed RPC\n // response surfaces as an error instead of a silently-truncated prize list.\n const prizeEnum = record.prize as Record<string, unknown> | undefined;\n if (!prizeEnum) {\n throw new Error(`PrizeRecord missing prize field: ${JSON.stringify(raw)}`);\n }\n const activePrize =\n typeof prizeEnum.activeVariant === \"function\"\n ? (prizeEnum.activeVariant as () => string)()\n : prizeEnum.Token !== undefined\n ? \"Token\"\n : prizeEnum.Extension !== undefined\n ? \"Extension\"\n : null;\n const prizeVariantBag = (prizeEnum.variant ?? prizeEnum) as Record<string, unknown>;\n\n // Prize::Extension { address: ContractAddress, config: Span<felt252> } —\n // an external IPrizeExtension prize. Modelled with tokenType \"extension\"\n // and the token fields left null.\n if (activePrize === \"Extension\") {\n const ext = prizeVariantBag.Extension as Record<string, unknown> | undefined;\n return {\n prizeId: String(record.id ?? \"0\"),\n tournamentId: String(record.context_id ?? \"0\"),\n payoutPosition: 0,\n tokenAddress: null,\n tokenType: \"extension\",\n amount: null,\n tokenId: null,\n distributionType: null,\n distributionWeight: null,\n distributionShares: null,\n distributionCount: null,\n sponsorAddress: num.toHex(record.sponsor_address as bigint),\n extensionAddress:\n ext?.address != null ? num.toHex(ext.address as bigint) : null,\n extensionConfig: Array.isArray(ext?.config)\n ? (ext!.config as unknown[]).map((x) => num.toHex(x as bigint))\n : null,\n };\n }\n if (activePrize !== \"Token\") {\n throw new Error(`Unrecognised Prize variant: ${JSON.stringify(prizeEnum)}`);\n }\n\n const tokenPayload = prizeVariantBag.Token as Record<string, unknown> | undefined;\n if (!tokenPayload) {\n throw new Error(`Prize::Token missing payload: ${JSON.stringify(prizeEnum)}`);\n }\n\n const tokenTypeData = tokenPayload.token_type as Record<string, unknown> | undefined;\n\n // TokenTypeData is a Cairo enum: { erc20: ERC20Data } or { erc721: ERC721Data }\n let tokenType: \"erc20\" | \"erc721\" = \"erc20\";\n let amount: string | null = null;\n let tokenId: string | null = null;\n let distributionType: string | null = null;\n let distributionWeight: number | null = null;\n let distributionShares: number[] | null = null;\n let distributionCount: number | null = null;\n // NOTE: the `tournament_prizes` PrizeRecord does not carry the prize's\n // leaderboard position (it's assigned at add_prize time and stored\n // elsewhere), so the RPC path can't populate it — defaults to 0. The API\n // path hydrates the real position. Pre-existing viewer limitation,\n // independent of the #269 migration.\n let payoutPosition = 0;\n\n if (tokenTypeData) {\n // starknet.js v9 returns CairoCustomEnum with the active variant as a\n // non-undefined property. Check activeVariant() or the property value.\n const activeVariant = typeof tokenTypeData.activeVariant === \"function\"\n ? (tokenTypeData.activeVariant as () => string)()\n : tokenTypeData.erc20 !== undefined ? \"erc20\"\n : tokenTypeData.erc721 !== undefined ? \"erc721\"\n : null;\n\n // starknet.js v9 nests data under .variant.{name} or directly under .{name}\n const variantData = (tokenTypeData as Record<string, unknown>).variant as Record<string, unknown> | undefined;\n const unwrap = (name: string) =>\n (variantData?.[name] ?? tokenTypeData[name]) as Record<string, unknown> | undefined;\n\n if (activeVariant === \"erc20\") {\n const erc20 = unwrap(\"erc20\");\n tokenType = \"erc20\";\n amount = String(erc20?.amount ?? \"0\");\n\n // distribution is Option<Distribution> — unwrap the Option then the enum\n const distOption = erc20?.distribution as Record<string, unknown> | undefined;\n const distInner = distOption?.Some as Record<string, unknown> | undefined;\n if (distInner) {\n // Distribution enum: { variant: { Linear: n } } or { Linear: n }.\n // Custom carries a Span<u16>; the scalar variants carry a u32.\n const distVariant = (distInner.variant ?? distInner) as Record<string, unknown>;\n const distType = Object.keys(distVariant).find((k) => distVariant[k] !== undefined);\n if (distType) {\n distributionType = distType.toLowerCase();\n const distValue = distVariant[distType];\n if (distributionType === \"custom\") {\n distributionShares = Array.isArray(distValue)\n ? (distValue as unknown[]).map((v) => Number(v))\n : null;\n } else {\n distributionWeight = distValue != null ? Number(distValue) : null;\n }\n }\n }\n\n // distribution_count is Option<u32>\n const countOption = erc20?.distribution_count as Record<string, unknown> | undefined;\n distributionCount = countOption?.Some != null ? Number(countOption.Some) : null;\n } else if (activeVariant === \"erc721\") {\n const erc721 = unwrap(\"erc721\");\n tokenType = \"erc721\";\n tokenId = String(erc721?.id ?? \"0\");\n }\n }\n\n return {\n prizeId: String(record.id ?? \"0\"),\n tournamentId: String(record.context_id ?? \"0\"),\n payoutPosition,\n tokenAddress: num.toHex(tokenPayload.token_address as bigint),\n tokenType,\n amount,\n tokenId,\n distributionType,\n distributionWeight,\n distributionShares,\n distributionCount,\n sponsorAddress: num.toHex(record.sponsor_address as bigint),\n extensionAddress: null,\n extensionConfig: null,\n };\n}\n\n/** Unwrap a Cairo Option — starknet.js may return { Some: value } / { None: {} } or just the value */\nfunction parseOption(raw: unknown): unknown | null {\n if (raw === undefined || raw === null) return null;\n const obj = raw as Record<string, unknown>;\n if (\"Some\" in obj) return obj.Some;\n if (\"None\" in obj) return null;\n // Some starknet.js versions flatten the option\n return raw;\n}\n\nfunction decodeOptionalByteArray(raw: unknown): string | null {\n const inner = parseOption(raw);\n if (!inner) return null;\n return decodeByteArray(inner);\n}\n\nfunction parseOptionalAddress(raw: unknown): string | null {\n const inner = parseOption(raw);\n if (!inner) return null;\n const hex = num.toHex(inner as bigint);\n return hex === \"0x0\" ? null : hex;\n}\n\n// =========================================================================\n// Viewer functions\n// =========================================================================\n\ninterface TournamentFilterResult {\n tournamentIds: string[];\n total: number;\n}\n\nfunction parseFilterResult(raw: unknown): TournamentFilterResult {\n const obj = raw as Record<string, unknown>;\n const ids = (obj.tournament_ids as unknown[])?.map((v) => String(v)) ?? [];\n const total = Number(obj.total ?? 0);\n return { tournamentIds: ids, total };\n}\n\nfunction parseTournamentFullState(raw: unknown): Tournament {\n const obj = raw as Record<string, unknown>;\n const entryCount = Number(obj.entry_count ?? 0);\n const protocolFeeShare =\n obj.protocol_fee_bps != null ? Number(obj.protocol_fee_bps) : null;\n return parseTournament(obj.tournament, entryCount, protocolFeeShare);\n}\n\n// --- Tournament listing ---\n\nexport async function viewerTournaments(\n contract: Contract,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments\", [offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\nexport async function viewerTournamentsByGame(\n contract: Contract,\n gameAddress: string,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_game\", [gameAddress, offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\nexport async function viewerTournamentsByCreator(\n contract: Contract,\n creator: string,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_creator\", [creator, offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\n/**\n * Map a single SDK phase to the group of on-chain phases it represents.\n * \"scheduled\" includes Scheduled + Registration + Staging (all pre-game).\n * \"live\" includes Live + Submission (active gameplay).\n * \"finalized\" stays as-is.\n */\nconst PHASE_GROUPS: Record<Phase, Phase[]> = {\n scheduled: [\"scheduled\", \"registration\", \"staging\"],\n registration: [\"registration\"],\n staging: [\"staging\"],\n live: [\"live\", \"submission\"],\n submission: [\"submission\"],\n finalized: [\"finalized\"],\n};\n\nexport async function viewerTournamentsByPhase(\n contract: Contract,\n phase: Phase,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n const phases = PHASE_GROUPS[phase];\n if (phases.length === 1) {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_phase\", [phaseToRpcArg(phase), offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n }\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_phases\", [phases.map(phaseToRpcArg), offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\n// --- Tournament detail ---\n\nexport async function viewerTournamentDetail(\n contract: Contract,\n tournamentId: string,\n): Promise<Tournament | null> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_detail\", [tournamentId]);\n const tournament = parseTournamentFullState(result);\n // Viewer returns a zero-filled struct for non-existent tournaments\n if (!tournament.gameAddress || tournament.gameAddress === \"0x0\") return null;\n return tournament;\n }, contract.address);\n}\n\nexport async function viewerTournamentsBatch(\n contract: Contract,\n tournamentIds: string[],\n): Promise<Tournament[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_batch\", [tournamentIds]);\n return (result as unknown[]).map(parseTournamentFullState);\n }, contract.address);\n}\n\n// --- Registrations ---\n\nexport async function viewerRegistrations(\n contract: Contract,\n tournamentId: string,\n offset: number,\n limit: number,\n): Promise<PaginatedResult<Registration>> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_registrations\", [tournamentId, offset, limit]);\n const obj = result as Record<string, unknown>;\n const entries = (obj.entries as unknown[]) ?? [];\n const total = Number(obj.total ?? 0);\n return {\n data: entries.map((e) => parseRegistration(e, tournamentId)),\n total,\n limit,\n offset,\n };\n }, contract.address);\n}\n\nexport async function viewerRegistrationsByTokenIds(\n contract: Contract,\n tournamentId: string,\n tokenIds: string[],\n offset: number,\n limit: number,\n): Promise<PaginatedResult<Registration>> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_registrations_by_token_ids\", [tournamentId, tokenIds, offset, limit]);\n const obj = result as Record<string, unknown>;\n const entries = (obj.entries as unknown[]) ?? [];\n const total = Number(obj.total ?? 0);\n return {\n data: entries.map((e) => parseRegistration(e, tournamentId)),\n total,\n limit,\n offset,\n };\n }, contract.address);\n}\n\n// --- Leaderboard ---\n\nexport async function viewerLeaderboard(\n contract: Contract,\n tournamentId: string,\n offset: number,\n limit: number,\n): Promise<LeaderboardEntry[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"leaderboard\", [tournamentId, offset, limit]);\n return (result as unknown[]).map(parseLeaderboardEntry);\n }, contract.address);\n}\n\n// --- Prizes ---\n\nexport async function viewerPrizes(\n contract: Contract,\n tournamentId: string,\n): Promise<Prize[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_prizes\", [tournamentId]);\n return (result as unknown[]).map(parsePrize);\n }, contract.address);\n}\n\n// --- Reward Claims ---\n\nimport type { RewardClaimKind } from \"../types/prize.js\";\n\n/**\n * Flat reward-claim shape returned by the on-chain viewer's\n * `tournament_reward_claims` view, after translating the Cairo\n * `RewardType` enum (deserialized as a CairoCustomEnum by starknet.js)\n * into the structured fields the API also exposes. Mirrors the\n * `RewardClaim` SDK type so the RPC and API paths are interchangeable.\n */\nexport interface ViewerRewardClaim {\n claimKind: RewardClaimKind;\n prizeId: string | null;\n payoutIndex: number | null;\n position: number | null;\n refundTokenId: string | null;\n extensionTokenId: string | null;\n extensionParams: string[] | null;\n claimed: boolean;\n}\n\nexport interface ViewerRewardClaimResult {\n claims: ViewerRewardClaim[];\n total: number;\n totalClaimed: number;\n totalUnclaimed: number;\n}\n\n/**\n * Translate the on-chain `RewardType` CairoCustomEnum (as returned by\n * starknet.js for the `tournament_reward_claims` view) into the same\n * structured fields the API exposes. Both starknet.js shapes are accepted —\n * one with `activeVariant()` and a `variant` bag, one with a flat record\n * keyed by variant name — depending on the contract ABI codegen.\n */\ntype TranslatedRewardClaim = {\n claimKind: RewardClaimKind;\n prizeId: string | null;\n payoutIndex: number | null;\n position: number | null;\n refundTokenId: string | null;\n extensionTokenId: string | null;\n extensionParams: string[] | null;\n};\n\n// All fields default to null; each variant fills only what it carries.\nfunction rewardClaim(\n partial: Partial<TranslatedRewardClaim> & { claimKind: RewardClaimKind },\n): TranslatedRewardClaim {\n return {\n prizeId: null,\n payoutIndex: null,\n position: null,\n refundTokenId: null,\n extensionTokenId: null,\n extensionParams: null,\n ...partial,\n };\n}\n\n// Span<felt252> → hex strings; tolerates the array shape starknet.js returns.\nfunction spanToHex(v: unknown): string[] {\n return Array.isArray(v) ? v.map((x) => num.toHex(x as bigint)) : [];\n}\n\nfunction translateCairoRewardType(rewardType: unknown): TranslatedRewardClaim {\n if (!rewardType || typeof rewardType !== \"object\") {\n throw new Error(`Unexpected RewardType payload: ${JSON.stringify(rewardType)}`);\n }\n const rt = rewardType as Record<string, any>;\n const outer =\n typeof rt.activeVariant === \"function\" ? rt.activeVariant() : null;\n const innerBag = (typeof rt.activeVariant === \"function\" ? rt.variant : rt) as Record<string, any>;\n\n if (outer === \"Prize\" || innerBag.Prize !== undefined) {\n // PrizeClaim { Token: PrizeType, Extension: ExtensionPrizeClaim }.\n const prizeClaim = innerBag.Prize;\n const pcBag = (typeof prizeClaim?.activeVariant === \"function\"\n ? prizeClaim.variant\n : prizeClaim) as Record<string, any>;\n\n // PrizeClaim::Extension { prize_id: u64, token_id: Option<felt252>,\n // payout_params: Span<felt252> }.\n if (pcBag?.Token === undefined && pcBag?.Extension !== undefined) {\n const ext = pcBag.Extension as Record<string, any>;\n const tokenId = parseOption(ext.token_id);\n return rewardClaim({\n claimKind: \"prize_extension\",\n prizeId: BigInt(ext.prize_id ?? 0).toString(),\n extensionTokenId: tokenId != null ? num.toHex(tokenId as bigint) : null,\n extensionParams: spanToHex(ext.payout_params),\n });\n }\n\n // PrizeClaim::Token(PrizeType). Unwrap Token; fall back to the older flat shape.\n const prize = pcBag?.Token ?? prizeClaim;\n const subVariant = typeof prize?.activeVariant === \"function\" ? prize.activeVariant() : null;\n const subBag = (typeof prize?.activeVariant === \"function\" ? prize.variant : prize) as Record<string, any>;\n\n if (subVariant === \"Single\" || subBag?.Single !== undefined) {\n return rewardClaim({\n claimKind: \"prize_single\",\n prizeId: BigInt(subBag.Single).toString(),\n });\n }\n if (subVariant === \"Distributed\" || subBag?.Distributed !== undefined) {\n const distributed = subBag.Distributed;\n const prizeId = distributed?.[\"0\"] ?? distributed?.[0];\n const payoutIndex = distributed?.[\"1\"] ?? distributed?.[1];\n return rewardClaim({\n claimKind: \"prize_distributed\",\n prizeId: BigInt(prizeId).toString(),\n payoutIndex: Number(payoutIndex),\n });\n }\n }\n\n if (outer === \"EntryFee\" || innerBag.EntryFee !== undefined) {\n // EntryFeeClaim { Token: EntryFeeRewardType, Extension: ExtensionEntryFeeClaim }.\n const entryFeeClaim = innerBag.EntryFee;\n const efBag = (typeof entryFeeClaim?.activeVariant === \"function\"\n ? entryFeeClaim.variant\n : entryFeeClaim) as Record<string, any>;\n\n // EntryFeeClaim::Extension { token_id: Option<felt252>, claim_params: Span<felt252> }.\n if (efBag?.Token === undefined && efBag?.Extension !== undefined) {\n const ext = efBag.Extension as Record<string, any>;\n const tokenId = parseOption(ext.token_id);\n return rewardClaim({\n claimKind: \"entry_fee_extension\",\n extensionTokenId: tokenId != null ? num.toHex(tokenId as bigint) : null,\n extensionParams: spanToHex(ext.claim_params),\n });\n }\n\n // EntryFeeClaim::Token(EntryFeeRewardType). Unwrap Token; fall back to flat.\n const entryFee = efBag?.Token ?? entryFeeClaim;\n const subVariant =\n typeof entryFee?.activeVariant === \"function\" ? entryFee.activeVariant() : null;\n const subBag = (typeof entryFee?.activeVariant === \"function\" ? entryFee.variant : entryFee) as Record<string, any>;\n\n if (subVariant === \"Position\" || subBag?.Position !== undefined) {\n return rewardClaim({\n claimKind: \"entry_fee_position\",\n position: Number(subBag.Position),\n });\n }\n if (subVariant === \"TournamentCreator\" || subBag?.TournamentCreator !== undefined) {\n return rewardClaim({ claimKind: \"entry_fee_tournament_creator\" });\n }\n if (subVariant === \"GameCreator\" || subBag?.GameCreator !== undefined) {\n return rewardClaim({ claimKind: \"entry_fee_game_creator\" });\n }\n if (subVariant === \"ProtocolFee\" || subBag?.ProtocolFee !== undefined) {\n return rewardClaim({ claimKind: \"entry_fee_protocol_fee\" });\n }\n if (subVariant === \"Refund\" || subBag?.Refund !== undefined) {\n return rewardClaim({\n claimKind: \"entry_fee_refund\",\n refundTokenId: `0x${BigInt(subBag.Refund).toString(16)}`,\n });\n }\n }\n\n throw new Error(\n `Unrecognised on-chain RewardType variant: ${JSON.stringify(rewardType)}`,\n );\n}\n\nexport async function viewerRewardClaims(\n contract: Contract,\n tournamentId: string,\n offset: number,\n limit: number,\n): Promise<ViewerRewardClaimResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_reward_claims\", [tournamentId, offset, limit]);\n const obj = result as Record<string, unknown>;\n const claims: ViewerRewardClaim[] = ((obj.claims as unknown[]) ?? []).map(\n (raw) => {\n const claim = raw as Record<string, unknown>;\n return {\n ...translateCairoRewardType(claim.reward_type),\n claimed: Boolean(claim.claimed),\n };\n },\n );\n return {\n claims,\n total: Number(obj.total ?? 0),\n totalClaimed: Number(obj.total_claimed ?? 0),\n totalUnclaimed: Number(obj.total_unclaimed ?? 0),\n };\n }, contract.address);\n}\n\n","[\n {\n \"type\": \"impl\",\n \"name\": \"UpgradeableImpl\",\n \"interface_name\": \"openzeppelin_interfaces::upgrades::IUpgradeable\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::upgrades::IUpgradeable\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"upgrade\",\n \"inputs\": [\n {\n \"name\": \"new_class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"BudokanViewerImpl\",\n \"interface_name\": \"budokan_interfaces::viewer::IBudokanViewer\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::TournamentFilterResult\",\n \"members\": [\n {\n \"name\": \"tournament_ids\",\n \"type\": \"core::array::Array::<core::integer::u64>\"\n },\n {\n \"name\": \"total\",\n \"type\": \"core::integer::u64\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::Phase\",\n \"variants\": [\n {\n \"name\": \"Scheduled\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Registration\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Staging\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Live\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Submission\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Finalized\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::byte_array::ByteArray\",\n \"members\": [\n {\n \"name\": \"data\",\n \"type\": \"core::array::Array::<core::bytes_31::bytes31>\"\n },\n {\n \"name\": \"pending_word\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"pending_word_len\",\n \"type\": \"core::internal::bounded_int::BoundedInt::<0, 30>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Metadata\",\n \"members\": [\n {\n \"name\": \"name\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"description\",\n \"type\": \"core::byte_array::ByteArray\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Schedule\",\n \"members\": [\n {\n \"name\": \"registration_start_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"registration_end_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_start_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_end_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"submission_duration\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::bool\",\n \"variants\": [\n {\n \"name\": \"False\",\n \"type\": \"()\"\n },\n {\n \"name\": \"True\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::byte_array::ByteArray>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::byte_array::ByteArray\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::GameConfig\",\n \"members\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"settings_id\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"soulbound\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"paymaster\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"client_url\",\n \"type\": \"core::option::Option::<core::byte_array::ByteArray>\"\n },\n {\n \"name\": \"renderer\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::integer::u16>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::integer::u16>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::distribution::Distribution\",\n \"variants\": [\n {\n \"name\": \"Linear\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"Exponential\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"Uniform\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Custom\",\n \"type\": \"core::array::Span::<core::integer::u16>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::EntryFee\",\n \"members\": [\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"tournament_creator_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"game_creator_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"refund_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"game_components_interfaces::distribution::Distribution\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::felt252>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"metagame_extensions_interfaces::extension::ExtensionConfig\",\n \"members\": [\n {\n \"name\": \"address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"config\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeKind\",\n \"variants\": [\n {\n \"name\": \"BuiltIn\",\n \"type\": \"budokan_interfaces::budokan::EntryFee\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"metagame_extensions_interfaces::extension::ExtensionConfig\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<budokan_interfaces::budokan::EntryFeeKind>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeKind\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::entry_requirement::EntryRequirementType\",\n \"variants\": [\n {\n \"name\": \"token\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"extension\",\n \"type\": \"metagame_extensions_interfaces::extension::ExtensionConfig\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_requirement::EntryRequirement\",\n \"members\": [\n {\n \"name\": \"entry_limit\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"entry_requirement_type\",\n \"type\": \"game_components_interfaces::entry_requirement::EntryRequirementType\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::entry_requirement::EntryRequirement\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::LeaderboardConfig\",\n \"members\": [\n {\n \"name\": \"ascending\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"game_must_be_over\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Tournament\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"created_at\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"created_by\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"creator_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"metadata\",\n \"type\": \"budokan_interfaces::budokan::Metadata\"\n },\n {\n \"name\": \"schedule\",\n \"type\": \"budokan_interfaces::budokan::Schedule\"\n },\n {\n \"name\": \"game_config\",\n \"type\": \"budokan_interfaces::budokan::GameConfig\"\n },\n {\n \"name\": \"entry_fee\",\n \"type\": \"core::option::Option::<budokan_interfaces::budokan::EntryFeeKind>\"\n },\n {\n \"name\": \"entry_requirement\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\"\n },\n {\n \"name\": \"leaderboard_config\",\n \"type\": \"budokan_interfaces::budokan::LeaderboardConfig\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::TournamentFullState\",\n \"members\": [\n {\n \"name\": \"tournament\",\n \"type\": \"budokan_interfaces::budokan::Tournament\"\n },\n {\n \"name\": \"entry_count\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"phase\",\n \"type\": \"budokan_interfaces::budokan::Phase\"\n },\n {\n \"name\": \"protocol_fee_bps\",\n \"type\": \"core::integer::u16\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::registration::Registration\",\n \"members\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"entry_id\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"has_submitted\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"is_banned\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::RegistrationResult\",\n \"members\": [\n {\n \"name\": \"entries\",\n \"type\": \"core::array::Array::<game_components_interfaces::registration::Registration>\"\n },\n {\n \"name\": \"total\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::LeaderboardEntryView\",\n \"members\": [\n {\n \"name\": \"position\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::distribution::Distribution\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::integer::u32>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ERC20Data\",\n \"members\": [\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::option::Option::<core::integer::u32>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ERC721Data\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u128\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::TokenTypeData\",\n \"variants\": [\n {\n \"name\": \"erc20\",\n \"type\": \"game_components_interfaces::prize::ERC20Data\"\n },\n {\n \"name\": \"erc721\",\n \"type\": \"game_components_interfaces::prize::ERC721Data\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::TokenPrizePayload\",\n \"members\": [\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"token_type\",\n \"type\": \"game_components_interfaces::prize::TokenTypeData\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ExtensionPrizePayload\",\n \"members\": [\n {\n \"name\": \"address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"config\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::Prize\",\n \"variants\": [\n {\n \"name\": \"Token\",\n \"type\": \"game_components_interfaces::prize::TokenPrizePayload\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"game_components_interfaces::prize::ExtensionPrizePayload\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::PrizeRecord\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"sponsor_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"prize\",\n \"type\": \"game_components_interfaces::prize::Prize\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::PrizeType\",\n \"variants\": [\n {\n \"name\": \"Single\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"Distributed\",\n \"type\": \"(core::integer::u64, core::integer::u32)\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::felt252>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::ExtensionPrizeClaim\",\n \"members\": [\n {\n \"name\": \"prize_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::option::Option::<core::felt252>\"\n },\n {\n \"name\": \"payout_params\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::PrizeClaim\",\n \"variants\": [\n {\n \"name\": \"Token\",\n \"type\": \"game_components_interfaces::prize::PrizeType\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"budokan_interfaces::budokan::ExtensionPrizeClaim\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeRewardType\",\n \"variants\": [\n {\n \"name\": \"Position\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"TournamentCreator\",\n \"type\": \"()\"\n },\n {\n \"name\": \"GameCreator\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Refund\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"ProtocolFee\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::ExtensionEntryFeeClaim\",\n \"members\": [\n {\n \"name\": \"token_id\",\n \"type\": \"core::option::Option::<core::felt252>\"\n },\n {\n \"name\": \"claim_params\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeClaim\",\n \"variants\": [\n {\n \"name\": \"Token\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeRewardType\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"budokan_interfaces::budokan::ExtensionEntryFeeClaim\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::RewardType\",\n \"variants\": [\n {\n \"name\": \"Prize\",\n \"type\": \"budokan_interfaces::budokan::PrizeClaim\"\n },\n {\n \"name\": \"EntryFee\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeClaim\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::RewardClaimView\",\n \"members\": [\n {\n \"name\": \"reward_type\",\n \"type\": \"budokan_interfaces::budokan::RewardType\"\n },\n {\n \"name\": \"claimed\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::RewardClaimResult\",\n \"members\": [\n {\n \"name\": \"claims\",\n \"type\": \"core::array::Array::<budokan_interfaces::viewer::RewardClaimView>\"\n },\n {\n \"name\": \"total\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"total_claimed\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"total_unclaimed\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"budokan_interfaces::viewer::IBudokanViewer\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"tournaments\",\n \"inputs\": [\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_game\",\n \"inputs\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_creator\",\n \"inputs\": [\n {\n \"name\": \"creator\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_phase\",\n \"inputs\": [\n {\n \"name\": \"phase\",\n \"type\": \"budokan_interfaces::budokan::Phase\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_phases\",\n \"inputs\": [\n {\n \"name\": \"phases\",\n \"type\": \"core::array::Array::<budokan_interfaces::budokan::Phase>\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_game\",\n \"inputs\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_creator\",\n \"inputs\": [\n {\n \"name\": \"creator\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_phase\",\n \"inputs\": [\n {\n \"name\": \"phase\",\n \"type\": \"budokan_interfaces::budokan::Phase\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_phases\",\n \"inputs\": [\n {\n \"name\": \"phases\",\n \"type\": \"core::array::Array::<budokan_interfaces::budokan::Phase>\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_detail\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFullState\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_batch\",\n \"inputs\": [\n {\n \"name\": \"tournament_ids\",\n \"type\": \"core::array::Array::<core::integer::u64>\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<budokan_interfaces::viewer::TournamentFullState>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_registrations\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::RegistrationResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_registrations_by_owner\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::RegistrationResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_registrations_by_token_ids\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_ids\",\n \"type\": \"core::array::Array::<core::felt252>\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::RegistrationResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"leaderboard\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<budokan_interfaces::viewer::LeaderboardEntryView>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_prizes\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<game_components_interfaces::prize::PrizeRecord>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_reward_claims\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::RewardClaimResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"player_tournaments\",\n \"inputs\": [\n {\n \"name\": \"player_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"OwnableImpl\",\n \"interface_name\": \"openzeppelin_interfaces::access::ownable::IOwnable\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::access::ownable::IOwnable\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"owner\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"transfer_ownership\",\n \"inputs\": [\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"renounce_ownership\",\n \"inputs\": [],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"OwnableCamelOnlyImpl\",\n \"interface_name\": \"openzeppelin_interfaces::access::ownable::IOwnableCamelOnly\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::access::ownable::IOwnableCamelOnly\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"transferOwnership\",\n \"inputs\": [\n {\n \"name\": \"newOwner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"renounceOwnership\",\n \"inputs\": [],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"constructor\",\n \"name\": \"constructor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"budokan_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"previous_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"previous_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"OwnershipTransferred\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"OwnershipTransferStarted\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Upgraded\",\n \"type\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan_viewer::budokan_viewer::BudokanViewer::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"OwnableEvent\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"UpgradeableEvent\",\n \"type\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event\",\n \"kind\": \"flat\"\n }\n ]\n }\n]\n","[\n {\n \"type\": \"impl\",\n \"name\": \"UpgradeableImpl\",\n \"interface_name\": \"openzeppelin_interfaces::upgrades::IUpgradeable\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::upgrades::IUpgradeable\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"upgrade\",\n \"inputs\": [\n {\n \"name\": \"new_class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"BudokanRewardsAdminImpl\",\n \"interface_name\": \"budokan::budokan::Budokan::IBudokanRewardsAdmin\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"budokan::budokan::Budokan::IBudokanRewardsAdmin\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"set_rewards_class_hash\",\n \"inputs\": [\n {\n \"name\": \"new_class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"rewards_class_hash\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::class_hash::ClassHash\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"GameContextImpl\",\n \"interface_name\": \"game_components_interfaces::metagame::context::IMetagameContext\"\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::bool\",\n \"variants\": [\n {\n \"name\": \"False\",\n \"type\": \"()\"\n },\n {\n \"name\": \"True\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::metagame::context::IMetagameContext\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"has_context\",\n \"inputs\": [\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"GameContextDetailsImpl\",\n \"interface_name\": \"game_components_interfaces::metagame::context::IMetagameContextDetails\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::byte_array::ByteArray\",\n \"members\": [\n {\n \"name\": \"data\",\n \"type\": \"core::array::Array::<core::bytes_31::bytes31>\"\n },\n {\n \"name\": \"pending_word\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"pending_word_len\",\n \"type\": \"core::internal::bounded_int::BoundedInt::<0, 30>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::integer::u32>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::structs::metagame::GameContext\",\n \"members\": [\n {\n \"name\": \"name\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"value\",\n \"type\": \"core::felt252\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<game_components_interfaces::structs::metagame::GameContext>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<game_components_interfaces::structs::metagame::GameContext>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::structs::metagame::GameContextDetails\",\n \"members\": [\n {\n \"name\": \"name\",\n \"type\": \"core::byte_array::ByteArray\"\n },\n {\n \"name\": \"description\",\n \"type\": \"core::byte_array::ByteArray\"\n },\n {\n \"name\": \"id\",\n \"type\": \"core::option::Option::<core::integer::u32>\"\n },\n {\n \"name\": \"context\",\n \"type\": \"core::array::Span::<game_components_interfaces::structs::metagame::GameContext>\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::metagame::context::IMetagameContextDetails\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"context_details\",\n \"inputs\": [\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"game_components_interfaces::structs::metagame::GameContextDetails\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"BudokanImpl\",\n \"interface_name\": \"budokan_interfaces::budokan::IBudokan\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Metadata\",\n \"members\": [\n {\n \"name\": \"name\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"description\",\n \"type\": \"core::byte_array::ByteArray\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Schedule\",\n \"members\": [\n {\n \"name\": \"registration_start_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"registration_end_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_start_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_end_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"submission_duration\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::byte_array::ByteArray>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::byte_array::ByteArray\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::GameConfig\",\n \"members\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"settings_id\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"soulbound\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"paymaster\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"client_url\",\n \"type\": \"core::option::Option::<core::byte_array::ByteArray>\"\n },\n {\n \"name\": \"renderer\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::integer::u16>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::integer::u16>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::distribution::Distribution\",\n \"variants\": [\n {\n \"name\": \"Linear\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"Exponential\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"Uniform\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Custom\",\n \"type\": \"core::array::Span::<core::integer::u16>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::EntryFee\",\n \"members\": [\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"tournament_creator_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"game_creator_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"refund_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"game_components_interfaces::distribution::Distribution\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::felt252>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"metagame_extensions_interfaces::extension::ExtensionConfig\",\n \"members\": [\n {\n \"name\": \"address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"config\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeKind\",\n \"variants\": [\n {\n \"name\": \"BuiltIn\",\n \"type\": \"budokan_interfaces::budokan::EntryFee\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"metagame_extensions_interfaces::extension::ExtensionConfig\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<budokan_interfaces::budokan::EntryFeeKind>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeKind\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::entry_requirement::EntryRequirementType\",\n \"variants\": [\n {\n \"name\": \"token\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"extension\",\n \"type\": \"metagame_extensions_interfaces::extension::ExtensionConfig\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_requirement::EntryRequirement\",\n \"members\": [\n {\n \"name\": \"entry_limit\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"entry_requirement_type\",\n \"type\": \"game_components_interfaces::entry_requirement::EntryRequirementType\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::entry_requirement::EntryRequirement\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::LeaderboardConfig\",\n \"members\": [\n {\n \"name\": \"ascending\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"game_must_be_over\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Tournament\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"created_at\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"created_by\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"creator_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"metadata\",\n \"type\": \"budokan_interfaces::budokan::Metadata\"\n },\n {\n \"name\": \"schedule\",\n \"type\": \"budokan_interfaces::budokan::Schedule\"\n },\n {\n \"name\": \"game_config\",\n \"type\": \"budokan_interfaces::budokan::GameConfig\"\n },\n {\n \"name\": \"entry_fee\",\n \"type\": \"core::option::Option::<budokan_interfaces::budokan::EntryFeeKind>\"\n },\n {\n \"name\": \"entry_requirement\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\"\n },\n {\n \"name\": \"leaderboard_config\",\n \"type\": \"budokan_interfaces::budokan::LeaderboardConfig\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::Phase\",\n \"variants\": [\n {\n \"name\": \"Scheduled\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Registration\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Staging\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Live\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Submission\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Finalized\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::felt252>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::integer::u256\",\n \"members\": [\n {\n \"name\": \"low\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"high\",\n \"type\": \"core::integer::u128\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_requirement::NFTQualification\",\n \"members\": [\n {\n \"name\": \"token_id\",\n \"type\": \"core::integer::u256\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::entry_requirement::QualificationProof\",\n \"variants\": [\n {\n \"name\": \"NFT\",\n \"type\": \"game_components_interfaces::entry_requirement::NFTQualification\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::entry_requirement::QualificationProof>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::entry_requirement::QualificationProof\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::array::Span::<core::felt252>>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::array::Span::<core::felt252>\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::TournamentRecipientParams\",\n \"members\": [\n {\n \"name\": \"player_address\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n },\n {\n \"name\": \"qualifier\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n },\n {\n \"name\": \"qualification\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::QualificationProof>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::PrizeType\",\n \"variants\": [\n {\n \"name\": \"Single\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"Distributed\",\n \"type\": \"(core::integer::u64, core::integer::u32)\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::ExtensionPrizeClaim\",\n \"members\": [\n {\n \"name\": \"prize_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::option::Option::<core::felt252>\"\n },\n {\n \"name\": \"payout_params\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::PrizeClaim\",\n \"variants\": [\n {\n \"name\": \"Token\",\n \"type\": \"game_components_interfaces::prize::PrizeType\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"budokan_interfaces::budokan::ExtensionPrizeClaim\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeRewardType\",\n \"variants\": [\n {\n \"name\": \"Position\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"TournamentCreator\",\n \"type\": \"()\"\n },\n {\n \"name\": \"GameCreator\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Refund\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"ProtocolFee\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::ExtensionEntryFeeClaim\",\n \"members\": [\n {\n \"name\": \"token_id\",\n \"type\": \"core::option::Option::<core::felt252>\"\n },\n {\n \"name\": \"claim_params\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeClaim\",\n \"variants\": [\n {\n \"name\": \"Token\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeRewardType\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"budokan_interfaces::budokan::ExtensionEntryFeeClaim\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::RewardType\",\n \"variants\": [\n {\n \"name\": \"Prize\",\n \"type\": \"budokan_interfaces::budokan::PrizeClaim\"\n },\n {\n \"name\": \"EntryFee\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeClaim\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::distribution::Distribution\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ERC20Data\",\n \"members\": [\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::option::Option::<core::integer::u32>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ERC721Data\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u128\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::TokenTypeData\",\n \"variants\": [\n {\n \"name\": \"erc20\",\n \"type\": \"game_components_interfaces::prize::ERC20Data\"\n },\n {\n \"name\": \"erc721\",\n \"type\": \"game_components_interfaces::prize::ERC721Data\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::TokenPrizePayload\",\n \"members\": [\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"token_type\",\n \"type\": \"game_components_interfaces::prize::TokenTypeData\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ExtensionPrizePayload\",\n \"members\": [\n {\n \"name\": \"address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"config\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::Prize\",\n \"variants\": [\n {\n \"name\": \"Token\",\n \"type\": \"game_components_interfaces::prize::TokenPrizePayload\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"game_components_interfaces::prize::ExtensionPrizePayload\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"budokan_interfaces::budokan::IBudokan\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"total_tournaments\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::budokan::Tournament\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"current_phase\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::budokan::Phase\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_distribution_shares\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<core::integer::u16>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"create_tournament\",\n \"inputs\": [\n {\n \"name\": \"creator_rewards_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"metadata\",\n \"type\": \"budokan_interfaces::budokan::Metadata\"\n },\n {\n \"name\": \"schedule\",\n \"type\": \"budokan_interfaces::budokan::Schedule\"\n },\n {\n \"name\": \"game_config\",\n \"type\": \"budokan_interfaces::budokan::GameConfig\"\n },\n {\n \"name\": \"entry_fee\",\n \"type\": \"core::option::Option::<budokan_interfaces::budokan::EntryFeeKind>\"\n },\n {\n \"name\": \"entry_requirement\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\"\n },\n {\n \"name\": \"leaderboard_config\",\n \"type\": \"budokan_interfaces::budokan::LeaderboardConfig\"\n },\n {\n \"name\": \"salt\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"metadata_value\",\n \"type\": \"core::integer::u16\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::budokan::Tournament\"\n }\n ],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"enter_tournament\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"player_name\",\n \"type\": \"core::option::Option::<core::felt252>\"\n },\n {\n \"name\": \"player_address\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n },\n {\n \"name\": \"qualifier\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n },\n {\n \"name\": \"qualification\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::QualificationProof>\"\n },\n {\n \"name\": \"entry_fee_pay_params\",\n \"type\": \"core::option::Option::<core::array::Span::<core::felt252>>\"\n },\n {\n \"name\": \"salt\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"metadata_value\",\n \"type\": \"core::integer::u16\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"(core::felt252, core::integer::u32)\"\n }\n ],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"enter_tournament_for_recipients\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"recipients\",\n \"type\": \"core::array::Array::<budokan_interfaces::budokan::TournamentRecipientParams>\"\n },\n {\n \"name\": \"player_name\",\n \"type\": \"core::option::Option::<core::felt252>\"\n },\n {\n \"name\": \"salt\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"metadata_value\",\n \"type\": \"core::integer::u16\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<core::felt252>\"\n }\n ],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"ban_entry\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"game_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"proof\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"submit_score\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"position\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"claim_reward\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"reward_type\",\n \"type\": \"budokan_interfaces::budokan::RewardType\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"add_prize\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"prize\",\n \"type\": \"game_components_interfaces::prize::Prize\"\n },\n {\n \"name\": \"position\",\n \"type\": \"core::option::Option::<core::integer::u32>\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"MetagameImpl\",\n \"interface_name\": \"game_components_interfaces::metagame::core::IMetagame\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::metagame::core::IMetagame\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"context_address\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"default_token_address\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"SRC5Impl\",\n \"interface_name\": \"openzeppelin_interfaces::introspection::ISRC5\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::introspection::ISRC5\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"supports_interface\",\n \"inputs\": [\n {\n \"name\": \"interface_id\",\n \"type\": \"core::felt252\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"OwnableImpl\",\n \"interface_name\": \"openzeppelin_interfaces::access::ownable::IOwnable\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::access::ownable::IOwnable\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"owner\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"transfer_ownership\",\n \"inputs\": [\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"renounce_ownership\",\n \"inputs\": [],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"EntryFeeImpl\",\n \"interface_name\": \"game_components_interfaces::entry_fee::IEntryFee\"\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::integer::u16>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_fee::AdditionalShare\",\n \"members\": [\n {\n \"name\": \"recipient\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"share_bps\",\n \"type\": \"core::integer::u16\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<game_components_interfaces::entry_fee::AdditionalShare>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<game_components_interfaces::entry_fee::AdditionalShare>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_fee::EntryFeeConfig\",\n \"members\": [\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"game_creator_share\",\n \"type\": \"core::option::Option::<core::integer::u16>\"\n },\n {\n \"name\": \"refund_share\",\n \"type\": \"core::option::Option::<core::integer::u16>\"\n },\n {\n \"name\": \"additional_shares\",\n \"type\": \"core::array::Span::<game_components_interfaces::entry_fee::AdditionalShare>\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::entry_fee::EntryFeeConfig>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::entry_fee::EntryFeeConfig\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::entry_fee::IEntryFee\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"get_entry_fee\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::option::Option::<game_components_interfaces::entry_fee::EntryFeeConfig>\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"EntryRequirementImpl\",\n \"interface_name\": \"game_components_interfaces::entry_requirement::IEntryRequirement\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_requirement::QualificationEntries\",\n \"members\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"qualification_proof\",\n \"type\": \"game_components_interfaces::entry_requirement::QualificationProof\"\n },\n {\n \"name\": \"entry_count\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::entry_requirement::IEntryRequirement\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"get_entry_requirement\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_qualification_entries\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"proof\",\n \"type\": \"game_components_interfaces::entry_requirement::QualificationProof\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"game_components_interfaces::entry_requirement::QualificationEntries\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"PrizeImpl\",\n \"interface_name\": \"game_components_interfaces::prize::IPrize\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::PrizeRecord\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"sponsor_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"prize\",\n \"type\": \"game_components_interfaces::prize::Prize\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::prize::IPrize\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"get_prize\",\n \"inputs\": [\n {\n \"name\": \"prize_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"game_components_interfaces::prize::PrizeRecord\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_total_prizes\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"is_prize_claimed\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"prize_type\",\n \"type\": \"game_components_interfaces::prize::PrizeType\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"RegistrationImpl\",\n \"interface_name\": \"game_components_interfaces::registration::IRegistration\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::registration::Registration\",\n \"members\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"entry_id\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"has_submitted\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"is_banned\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::registration::IRegistration\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"get_entry\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"entry_id\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"game_components_interfaces::registration::Registration\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"entry_exists\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"entry_id\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"is_token_banned\",\n \"inputs\": [\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_entry_count\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u32\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"LeaderboardImpl\",\n \"interface_name\": \"game_components_interfaces::leaderboard::ILeaderboard\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::structs::leaderboard::LeaderboardEntry\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"score\",\n \"type\": \"core::integer::u64\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::structs::leaderboard::LeaderboardStoreConfig\",\n \"members\": [\n {\n \"name\": \"max_entries\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"ascending\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::leaderboard::ILeaderboard\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"get_leaderboard_entries\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<game_components_interfaces::structs::leaderboard::LeaderboardEntry>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_leaderboard_entry\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"position\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"game_components_interfaces::structs::leaderboard::LeaderboardEntry\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_top_leaderboard_entries\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"count\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<game_components_interfaces::structs::leaderboard::LeaderboardEntry>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_position\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::option::Option::<core::integer::u32>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"qualifies\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"score\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"is_full\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_leaderboard_length\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u32\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_config\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"game_components_interfaces::structs::leaderboard::LeaderboardStoreConfig\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"find_position\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"score\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::option::Option::<core::integer::u32>\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"constructor\",\n \"name\": \"constructor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"default_token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_embeddable_game_standard::metagame::metagame_component::MetagameComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_embeddable_game_standard::metagame::extensions::context::context::ContextComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_introspection::src5::SRC5Component::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_metagame::leaderboard::leaderboard_component::LeaderboardComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"previous_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"previous_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"OwnershipTransferred\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"OwnershipTransferStarted\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Upgraded\",\n \"type\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_metagame::registration::registration_component::RegistrationComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_metagame::entry_fee::entry_fee_component::EntryFeeComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_metagame::entry_requirement::entry_requirement_component::EntryRequirementComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_metagame::prize::prize_component::PrizeComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_security::reentrancyguard::ReentrancyGuardComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::TournamentCreated\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"created_by\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"creator_token_id\",\n \"type\": \"core::felt252\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"metadata\",\n \"type\": \"budokan_interfaces::budokan::Metadata\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"config\",\n \"type\": \"core::felt252\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"client_url\",\n \"type\": \"core::option::Option::<core::byte_array::ByteArray>\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"renderer\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"entry_fee\",\n \"type\": \"core::option::Option::<budokan_interfaces::budokan::EntryFeeKind>\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"entry_requirement\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"protocol_fee_bps\",\n \"type\": \"core::integer::u16\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::TournamentRegistration\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"game_token_id\",\n \"type\": \"core::felt252\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"player_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"entry_number\",\n \"type\": \"core::integer::u32\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::TournamentEntryStateChanged\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"game_token_id\",\n \"type\": \"core::felt252\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"has_submitted\",\n \"type\": \"core::bool\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"is_banned\",\n \"type\": \"core::bool\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::PrizeAdded\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"prize_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"payout_position\",\n \"type\": \"core::integer::u32\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"prize\",\n \"type\": \"game_components_interfaces::prize::Prize\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"sponsor_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::RewardClaimed\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"reward_type\",\n \"type\": \"budokan_interfaces::budokan::RewardType\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"claimed\",\n \"type\": \"core::bool\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::QualificationEntriesUpdated\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"qualification_proof\",\n \"type\": \"game_components_interfaces::entry_requirement::QualificationProof\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"entry_count\",\n \"type\": \"core::integer::u32\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::budokan::Budokan::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"MetagameEvent\",\n \"type\": \"game_components_embeddable_game_standard::metagame::metagame_component::MetagameComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"ContextEvent\",\n \"type\": \"game_components_embeddable_game_standard::metagame::extensions::context::context::ContextComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"SRC5Event\",\n \"type\": \"openzeppelin_introspection::src5::SRC5Component::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"LeaderboardEvent\",\n \"type\": \"game_components_metagame::leaderboard::leaderboard_component::LeaderboardComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"OwnableEvent\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"UpgradeableEvent\",\n \"type\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"RegistrationEvent\",\n \"type\": \"game_components_metagame::registration::registration_component::RegistrationComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"EntryFeeEvent\",\n \"type\": \"game_components_metagame::entry_fee::entry_fee_component::EntryFeeComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"EntryRequirementEvent\",\n \"type\": \"game_components_metagame::entry_requirement::entry_requirement_component::EntryRequirementComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"PrizeEvent\",\n \"type\": \"game_components_metagame::prize::prize_component::PrizeComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"ReentrancyGuardEvent\",\n \"type\": \"openzeppelin_security::reentrancyguard::ReentrancyGuardComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"TournamentCreated\",\n \"type\": \"budokan::events::TournamentCreated\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"TournamentRegistration\",\n \"type\": \"budokan::events::TournamentRegistration\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"TournamentEntryStateChanged\",\n \"type\": \"budokan::events::TournamentEntryStateChanged\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"PrizeAdded\",\n \"type\": \"budokan::events::PrizeAdded\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"RewardClaimed\",\n \"type\": \"budokan::events::RewardClaimed\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"QualificationEntriesUpdated\",\n \"type\": \"budokan::events::QualificationEntriesUpdated\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"ProtocolFeeBpsUpdated\",\n \"type\": \"budokan::events::ProtocolFeeBpsUpdated\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"ProtocolFeeRecipientUpdated\",\n \"type\": \"budokan::events::ProtocolFeeRecipientUpdated\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"budokan::budokan::Budokan::IBudokanProtocolFeeAdmin\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"set_protocol_fee_bps\",\n \"inputs\": [\n {\n \"name\": \"bps\",\n \"type\": \"core::integer::u16\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"set_protocol_fee_recipient\",\n \"inputs\": [\n {\n \"name\": \"recipient\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"protocol_fee_bps\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::integer::u16\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"protocol_fee_recipient\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_protocol_fee_bps\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u16\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::ProtocolFeeBpsUpdated\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"bps\",\n \"type\": \"core::integer::u16\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::ProtocolFeeRecipientUpdated\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"recipient\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n }\n]\n","import type { Contract } from \"starknet\";\nimport { RpcError } from \"../errors/index.js\";\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\nfunction wrapRpcCall<T>(fn: () => Promise<T>, contractAddress?: string): Promise<T> {\n return fn().catch((error: unknown) => {\n throw new RpcError(\n error instanceof Error ? error.message : \"RPC call failed\",\n contractAddress,\n );\n });\n}\n\n// =========================================================================\n// Budokan contract read calls\n// =========================================================================\n\n/**\n * Fetch the full Custom distribution shares array for a tournament via the\n * Budokan contract's `tournament_distribution_shares(id)` view.\n *\n * Returns an empty array for tournaments configured with Linear /\n * Exponential / Uniform (those don't have a custom shares array), or for\n * tournaments that aren't configured yet.\n *\n * Consumers going through the primary API path don't need this — the\n * indexer already sources the shares from the `TournamentCreated` event.\n * This is the RPC-fallback path for direct on-chain reads.\n */\nexport async function budokanTournamentDistributionShares(\n contract: Contract,\n tournamentId: string,\n): Promise<number[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_distribution_shares\", [tournamentId]);\n const arr = Array.isArray(result) ? (result as unknown[]) : [];\n return arr.map((v) => Number(v));\n }, contract.address);\n}\n","import type { RpcProvider, Contract, Abi } from \"starknet\";\nimport type { BudokanClientConfig } from \"./types/config.js\";\nimport type { Tournament, TournamentListParams } from \"./types/tournament.js\";\nimport type { LeaderboardEntry } from \"./types/leaderboard.js\";\nimport type { Registration } from \"./types/registration.js\";\nimport type { Prize, RewardClaim, RewardClaimSummary, PrizeAggregation } from \"./types/prize.js\";\nimport type { PlatformStats, PrizeStats } from \"./types/activity.js\";\nimport type { QualificationEntry } from \"./types/tournament.js\";\nimport type { PaginatedResult } from \"./types/common.js\";\nimport type { WSChannel, WSEventHandler } from \"./types/websocket.js\";\nimport type { ConnectionStatusState } from \"./datasource/health.js\";\n\nimport {\n getTournaments as apiGetTournaments,\n getTournament as apiGetTournament,\n getTournamentRegistrations as apiGetTournamentRegistrations,\n getTournamentPrizes as apiGetTournamentPrizes,\n getTournamentRewardClaims as apiGetTournamentRewardClaims,\n getTournamentRewardClaimsSummary as apiGetTournamentRewardClaimsSummary,\n getTournamentQualifications as apiGetTournamentQualifications,\n getTournamentPrizeAggregation as apiGetTournamentPrizeAggregation,\n} from \"./api/tournaments.js\";\nimport {\n getGameTournaments as apiGetGameTournaments,\n getGameStats as apiGetGameStats,\n} from \"./api/games.js\";\nimport {\n getActivityStats as apiGetActivityStats,\n getPrizeStats as apiGetPrizeStats,\n} from \"./api/activity.js\";\nimport { WSManager } from \"./ws/manager.js\";\nimport { getChainConfig } from \"./chains/constants.js\";\nimport { ConnectionStatus } from \"./datasource/health.js\";\nimport { withFallback } from \"./datasource/resolver.js\";\nimport { RpcError } from \"./errors/index.js\";\nimport { createProvider, createContract } from \"./rpc/provider.js\";\nimport {\n viewerTournaments,\n viewerTournamentsByGame,\n viewerTournamentsByCreator,\n viewerTournamentsByPhase,\n viewerTournamentDetail,\n viewerTournamentsBatch,\n viewerRegistrations,\n viewerRegistrationsByTokenIds,\n viewerLeaderboard,\n viewerPrizes,\n viewerRewardClaims,\n} from \"./rpc/viewer.js\";\n\nimport viewerAbi from \"./rpc/abis/budokanViewer.json\";\nimport budokanAbi from \"./rpc/abis/budokan.json\";\nimport { budokanTournamentDistributionShares } from \"./rpc/budokan.js\";\n\n/** Resolved config with all defaults applied */\ninterface ResolvedConfig extends BudokanClientConfig {\n rpcUrl: string;\n viewerAddress: string;\n budokanAddress: string;\n}\n\n/**\n * Main client for interacting with the Budokan tournament system.\n *\n * Provides methods for querying tournaments, registrations, leaderboards,\n * prizes, player stats, and activity events. Supports real-time updates\n * via WebSocket subscriptions and automatic RPC fallback when the API is\n * unavailable.\n *\n * @example\n * ```ts\n * // API-only (default, backward compatible)\n * const client = new BudokanClient({\n * apiBaseUrl: \"https://budokan-api.provable.games\",\n * });\n *\n * // With RPC fallback\n * const client = new BudokanClient({\n * chain: \"mainnet\",\n * apiBaseUrl: \"https://budokan-api.provable.games\",\n * viewerAddress: \"0x...\",\n * });\n *\n * // RPC-only (bypass API entirely)\n * const client = new BudokanClient({\n * primarySource: \"rpc\",\n * rpcUrl: \"https://rpc.provable.games/rpc\",\n * viewerAddress: \"0x...\",\n * });\n * ```\n */\nexport class BudokanClient {\n private readonly resolvedConfig: ResolvedConfig;\n private readonly wsManager: WSManager;\n private readonly connectionStatus: ConnectionStatus;\n private cachedProvider: RpcProvider | null = null;\n private cachedViewerContract: Contract | null = null;\n private cachedBudokanContract: Contract | null = null;\n\n constructor(config: BudokanClientConfig) {\n // Merge user config with chain defaults\n const chainConfig = config.chain ? getChainConfig(config.chain) : undefined;\n this.resolvedConfig = {\n ...config,\n apiBaseUrl: config.apiBaseUrl ?? chainConfig?.apiBaseUrl ?? \"\",\n rpcUrl: config.rpcUrl ?? chainConfig?.rpcUrl ?? \"\",\n viewerAddress: config.viewerAddress ?? chainConfig?.viewerAddress ?? \"\",\n budokanAddress: config.budokanAddress ?? chainConfig?.budokanAddress ?? \"\",\n };\n\n const wsUrl = config.wsUrl ?? chainConfig?.wsUrl\n ?? this.resolvedConfig.apiBaseUrl.replace(/^http/, \"ws\").replace(/\\/$/, \"\") + \"/ws\";\n this.wsManager = new WSManager(wsUrl);\n\n this.connectionStatus = new ConnectionStatus(\n this.resolvedConfig.apiBaseUrl,\n this.resolvedConfig.rpcUrl,\n config.health,\n );\n\n // Start health monitoring if both sources are configured\n if (this.resolvedConfig.apiBaseUrl && this.resolvedConfig.rpcUrl) {\n this.connectionStatus.startMonitoring();\n }\n }\n\n // ---- Configuration ----\n\n /** Returns the resolved configuration. */\n get clientConfig(): BudokanClientConfig {\n return { ...this.resolvedConfig };\n }\n\n /** Whether the WebSocket is currently connected. */\n get wsConnected(): boolean {\n return this.wsManager.isConnected;\n }\n\n // ---- Connection status ----\n\n /** Returns the current connection status (API, RPC, mode). */\n getConnectionStatus(): ConnectionStatusState {\n return this.connectionStatus.getStatus();\n }\n\n /** Subscribe to connection status changes. Returns an unsubscribe function. */\n onConnectionStatusChange(listener: (status: ConnectionStatusState) => void): () => void {\n return this.connectionStatus.subscribe(listener);\n }\n\n // ---- Lazy RPC getters ----\n\n private async getProvider(): Promise<RpcProvider> {\n if (this.cachedProvider) return this.cachedProvider;\n if (!this.resolvedConfig.rpcUrl) {\n throw new RpcError(\"No rpcUrl configured\");\n }\n if (this.resolvedConfig.provider) {\n this.cachedProvider = this.resolvedConfig.provider;\n return this.cachedProvider;\n }\n this.cachedProvider = await createProvider(\n this.resolvedConfig.rpcUrl,\n this.resolvedConfig.rpcHeaders,\n );\n return this.cachedProvider;\n }\n\n private async getViewerContract(): Promise<Contract> {\n if (this.cachedViewerContract) return this.cachedViewerContract;\n if (!this.resolvedConfig.viewerAddress) {\n throw new RpcError(\"No viewerAddress configured. Set viewerAddress in config or use a chain preset with a deployed viewer contract.\");\n }\n const provider = await this.getProvider();\n this.cachedViewerContract = await createContract(\n viewerAbi as Abi,\n this.resolvedConfig.viewerAddress,\n provider,\n );\n return this.cachedViewerContract;\n }\n\n private async getBudokanContract(): Promise<Contract> {\n if (this.cachedBudokanContract) return this.cachedBudokanContract;\n if (!this.resolvedConfig.budokanAddress) {\n throw new RpcError(\"No budokanAddress configured. Set budokanAddress in config or use a chain preset with a deployed Budokan contract.\");\n }\n const provider = await this.getProvider();\n this.cachedBudokanContract = await createContract(\n budokanAbi as Abi,\n this.resolvedConfig.budokanAddress,\n provider,\n );\n return this.cachedBudokanContract;\n }\n\n // ---- API context ----\n\n private get apiCtx() {\n return {\n retryAttempts: this.resolvedConfig.retryAttempts,\n retryDelay: this.resolvedConfig.retryDelay,\n timeout: this.resolvedConfig.timeout,\n };\n }\n\n // ---- Tournament Queries ----\n\n /**\n * Fetch a paginated list of tournaments with optional filtering.\n * Supports RPC fallback when API is unavailable.\n */\n async getTournaments(params?: TournamentListParams): Promise<PaginatedResult<Tournament>> {\n const rpcFallback = async (): Promise<PaginatedResult<Tournament>> => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n\n // Choose the appropriate viewer filter function\n let filterResult: { tournamentIds: string[]; total: number };\n if (params?.phase) {\n filterResult = await viewerTournamentsByPhase(contract, params.phase, offset, limit);\n } else if (params?.gameAddress) {\n filterResult = await viewerTournamentsByGame(contract, params.gameAddress, offset, limit);\n } else if (params?.creator) {\n filterResult = await viewerTournamentsByCreator(contract, params.creator, offset, limit);\n } else {\n filterResult = await viewerTournaments(contract, offset, limit);\n }\n\n // Batch-fetch full tournament data for the returned IDs\n let data: Tournament[] = [];\n if (filterResult.tournamentIds.length > 0) {\n data = await viewerTournamentsBatch(contract, filterResult.tournamentIds);\n\n // Fetch prize aggregation if requested\n if (params?.includePrizeSummary) {\n const prizePromises = data.map((t) =>\n viewerPrizes(contract, t.id).catch(() => [] as Prize[]),\n );\n const allPrizes = await Promise.all(prizePromises);\n data = data.map((t, i) => {\n const prizes = allPrizes[i];\n if (prizes.length === 0) return t;\n // Build aggregation by token\n const tokenMap = new Map<string, { tokenAddress: string; tokenType: string; totalAmount: bigint; nftCount: number }>();\n for (const p of prizes) {\n // Extension prizes have no token address — not aggregable by token.\n if (p.tokenType === \"extension\" || p.tokenAddress == null) continue;\n const key = p.tokenAddress;\n const existing = tokenMap.get(key);\n if (existing) {\n existing.totalAmount += BigInt(p.amount ?? \"0\");\n if (p.tokenType === \"erc721\") existing.nftCount += 1;\n } else {\n tokenMap.set(key, {\n tokenAddress: p.tokenAddress,\n tokenType: p.tokenType,\n totalAmount: BigInt(p.amount ?? \"0\"),\n nftCount: p.tokenType === \"erc721\" ? 1 : 0,\n });\n }\n }\n return {\n ...t,\n prizeAggregation: Array.from(tokenMap.values()).map((v) => ({\n tokenAddress: v.tokenAddress,\n tokenType: v.tokenType,\n totalAmount: v.totalAmount.toString(),\n nftCount: v.nftCount,\n })),\n };\n });\n }\n }\n\n return { data, total: filterResult.total, limit, offset };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournaments(this.resolvedConfig.apiBaseUrl, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch a single tournament by its ID.\n * Supports RPC fallback when API is unavailable.\n *\n * On the RPC-fallback path, Custom distribution shares are populated via\n * a follow-up call to `tournament_distribution_shares(id)` so callers see\n * the same shape regardless of data source (the API/indexer path fills\n * shares from the `TournamentCreated` event).\n */\n async getTournament(tournamentId: string): Promise<Tournament | null> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n const tournament = await viewerTournamentDetail(contract, tournamentId);\n if (tournament) {\n await this.fillCustomSharesIfEmpty(tournament);\n }\n return tournament;\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n try {\n return await apiGetTournament(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx);\n } catch {\n // API 404 or network error — try RPC fallback\n try {\n this.connectionStatus.markApiUnavailable();\n return await rpcFallback();\n } catch {\n return null;\n }\n }\n }\n\n /**\n * If the tournament's entry-fee distribution is `Custom` with an empty\n * shares array (the on-chain `tournament()` view returns empty spans by\n * design to keep the hot path small), fetch the shares via the\n * dedicated view and graft them back onto the distribution object.\n *\n * Detection is tolerant: the Distribution shape may appear as\n * `{ variant: { Custom: [] } }` or a flattened `{ Custom: [] }`\n * depending on the starknet.js version / serialization path.\n */\n private async fillCustomSharesIfEmpty(tournament: Tournament): Promise<void> {\n const dist = tournament.entryFee?.distribution as unknown;\n if (!dist || typeof dist !== \"object\") return;\n\n const bag =\n ((dist as { variant?: Record<string, unknown> }).variant ??\n (dist as Record<string, unknown>)) as Record<string, unknown>;\n const customValue = bag.Custom ?? bag.custom;\n if (!Array.isArray(customValue) || customValue.length > 0) return;\n\n try {\n const shares = await this.getTournamentDistributionShares(tournament.id);\n if (shares.length > 0) {\n // Overwrite in place — Distribution is typed as opaque, so cast.\n (bag as Record<string, unknown>).Custom = shares;\n }\n } catch {\n // Silent — caller gets the empty array; auto-fill is best-effort.\n }\n }\n\n /**\n * Fetch the Custom distribution shares for a tournament via the Budokan\n * contract's `tournament_distribution_shares(id)` view.\n *\n * Returns an empty array for tournaments configured with\n * `Linear` / `Exponential` / `Uniform` distributions (those don't have a\n * shares array), and for tournaments without an entry fee.\n *\n * This is a direct RPC call — consumers going through the primary API\n * path typically don't need it, since the indexer sources Custom shares\n * from the `TournamentCreated` event and exposes them via\n * `getTournament()`'s `entryFee.distribution`. Use this when you need a\n * fresh on-chain read or you're operating in RPC-only mode.\n */\n async getTournamentDistributionShares(tournamentId: string): Promise<number[]> {\n const contract = await this.getBudokanContract();\n return budokanTournamentDistributionShares(contract, tournamentId);\n }\n\n /**\n * Fetch the leaderboard for a tournament from the on-chain viewer\n * contract. Live leaderboard data for UIs is best sourced via\n * denshokan-sdk's `useLiveLeaderboard`; this method is kept for\n * one-shot RPC reads (e.g. server-side scoring scripts).\n */\n async getTournamentLeaderboard(tournamentId: string): Promise<LeaderboardEntry[]> {\n const contract = await this.getViewerContract();\n // Fetch a large page; on-chain leaderboards are typically small\n return viewerLeaderboard(contract, tournamentId, 0, 1000);\n }\n\n /**\n * Fetch registrations for a tournament.\n * Supports RPC fallback when API is unavailable.\n * Note: In RPC mode, `playerAddress` and `gameAddress` fields will be empty strings,\n * and filter params (`playerAddress`, `gameTokenIds`, `hasSubmitted`, `isBanned`)\n * are applied via on-chain viewer functions where supported.\n */\n async getTournamentRegistrations(\n tournamentId: string,\n params?: { gameTokenIds?: string[]; hasSubmitted?: boolean; isBanned?: boolean; limit?: number; offset?: number },\n ): Promise<PaginatedResult<Registration>> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n if (params?.gameTokenIds?.length) {\n return viewerRegistrationsByTokenIds(contract, tournamentId, params.gameTokenIds, offset, limit);\n }\n return viewerRegistrations(contract, tournamentId, offset, limit);\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentRegistrations(this.resolvedConfig.apiBaseUrl, tournamentId, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch prizes for a tournament.\n * Supports RPC fallback when API is unavailable.\n */\n async getTournamentPrizes(tournamentId: string): Promise<Prize[]> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n return viewerPrizes(contract, tournamentId);\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentPrizes(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n // ---- Game Queries ----\n\n /**\n * Fetch tournaments for a specific game.\n * Supports RPC fallback when API is unavailable.\n */\n async getGameTournaments(\n gameAddress: string,\n params?: Omit<TournamentListParams, \"gameAddress\">,\n ): Promise<PaginatedResult<Tournament>> {\n const rpcFallback = async (): Promise<PaginatedResult<Tournament>> => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n const filterResult = await viewerTournamentsByGame(contract, gameAddress, offset, limit);\n\n let data: Tournament[] = [];\n if (filterResult.tournamentIds.length > 0) {\n data = await viewerTournamentsBatch(contract, filterResult.tournamentIds);\n }\n\n return { data, total: filterResult.total, limit, offset };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetGameTournaments(this.resolvedConfig.apiBaseUrl, gameAddress, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch tournament stats for a specific game.\n * API-only — no RPC fallback available.\n */\n async getGameStats(gameAddress: string): Promise<PlatformStats> {\n return apiGetGameStats(this.resolvedConfig.apiBaseUrl, gameAddress, this.apiCtx);\n }\n\n // ---- Reward Claims & Qualifications ----\n\n /**\n * Fetch reward claims for a tournament.\n * Supports RPC fallback via viewer contract.\n */\n async getTournamentRewardClaims(\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<PaginatedResult<RewardClaim>> {\n const rpcFallback = async (): Promise<PaginatedResult<RewardClaim>> => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 100;\n const result = await viewerRewardClaims(contract, tournamentId, offset, limit);\n const data: RewardClaim[] = result.claims.map((c) => ({\n tournamentId,\n ...c,\n }));\n return { data, total: result.total, limit, offset };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentRewardClaims(this.resolvedConfig.apiBaseUrl, tournamentId, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch reward claims summary for a tournament.\n * Supports RPC fallback via viewer contract.\n */\n async getTournamentRewardClaimsSummary(tournamentId: string): Promise<RewardClaimSummary> {\n const rpcFallback = async (): Promise<RewardClaimSummary> => {\n const contract = await this.getViewerContract();\n const result = await viewerRewardClaims(contract, tournamentId, 0, 0);\n return {\n totalPrizes: result.total,\n totalClaimed: result.totalClaimed,\n totalUnclaimed: result.totalUnclaimed,\n };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentRewardClaimsSummary(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch qualifications for a tournament.\n * API-only -- no RPC fallback available.\n */\n async getTournamentQualifications(\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<PaginatedResult<QualificationEntry>> {\n return apiGetTournamentQualifications(this.resolvedConfig.apiBaseUrl, tournamentId, params, this.apiCtx);\n }\n\n /**\n * Fetch prize aggregation for a tournament.\n * API-only -- no RPC fallback available.\n */\n async getTournamentPrizeAggregation(tournamentId: string): Promise<PrizeAggregation[]> {\n return apiGetTournamentPrizeAggregation(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx);\n }\n\n // ---- Activity Queries (API-only, activity is indexed) ----\n\n /**\n * Fetch platform-wide activity stats.\n * API-only — no RPC fallback available.\n */\n async getActivityStats(): Promise<PlatformStats> {\n return apiGetActivityStats(this.resolvedConfig.apiBaseUrl, this.apiCtx);\n }\n\n /**\n * Fetch platform-wide prize stats.\n * API-only — no RPC fallback available.\n */\n async getPrizeStats(): Promise<PrizeStats> {\n return apiGetPrizeStats(this.resolvedConfig.apiBaseUrl, this.apiCtx);\n }\n\n // ---- WebSocket ----\n\n /**\n * Open a WebSocket connection for real-time updates.\n */\n connect(): void {\n this.wsManager.connect();\n }\n\n /**\n * Close the WebSocket connection.\n */\n disconnect(): void {\n this.wsManager.disconnect();\n }\n\n /**\n * Stop health monitoring and close all connections.\n */\n destroy(): void {\n this.connectionStatus.destroy();\n this.wsManager.disconnect();\n }\n\n /**\n * Subscribe to WebSocket channels with optional tournament filtering.\n * Returns an unsubscribe function.\n */\n subscribe(\n channels: WSChannel[],\n handler: WSEventHandler,\n tournamentIds?: string[],\n ): () => void {\n return this.wsManager.subscribe({ channels, tournamentIds }, handler);\n }\n\n /**\n * Register a listener for WebSocket connection state changes.\n * Returns an unsubscribe function.\n */\n onWsConnectionChange(listener: (connected: boolean) => void): () => void {\n return this.wsManager.onConnectionChange(listener);\n }\n}\n\n/**\n * Factory function for creating a BudokanClient instance.\n */\nexport function createBudokanClient(config: BudokanClientConfig): BudokanClient {\n return new BudokanClient(config);\n}\n","import type {\n ExtensionPrize as MetagameSdkExtensionPrize,\n Prize as MetagameSdkTokenPrize,\n PrizeLike as MetagameSdkPrizeLike,\n} from \"@provable-games/metagame-sdk\";\nimport type {\n ExtensionPrize,\n Prize,\n TokenPrize,\n} from \"../types/prize.js\";\n\n// Adapter output types are derived from metagame-sdk@0.1.13. These exported\n// aliases are part of Budokan's public API; changing the pinned metagame-sdk\n// version needs a compatibility review.\nexport type MetagameTokenPrize = MetagameSdkTokenPrize;\nexport type MetagameExtensionPrize = MetagameSdkExtensionPrize;\nexport type MetagamePrizeLike = MetagameSdkPrizeLike;\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isNonNegativeIntegerString(value: unknown): value is string {\n if (!isNonEmptyString(value) || value.trim() !== value) return false;\n if (!/^\\d+$/.test(value)) return false;\n\n try {\n return BigInt(value) >= 0n;\n } catch {\n return false;\n }\n}\n\nfunction isNonNegativeIntegerNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value) && value >= 0;\n}\n\nfunction isPositiveIntegerNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value) && value > 0;\n}\n\nfunction isDistributionType(value: unknown): value is string {\n return (\n value === \"linear\" ||\n value === \"exponential\" ||\n value === \"uniform\" ||\n value === \"custom\"\n );\n}\n\nfunction hasNoDistributionFields(prize: Prize): boolean {\n return (\n prize.distributionType === null &&\n prize.distributionWeight === null &&\n prize.distributionShares === null &&\n prize.distributionCount === null\n );\n}\n\nfunction hasValidDistributionFields(prize: Prize): boolean {\n if (prize.distributionType === null) return hasNoDistributionFields(prize);\n if (!isDistributionType(prize.distributionType)) return false;\n if (!isPositiveIntegerNumber(prize.distributionCount)) return false;\n\n if (prize.distributionType === \"custom\") {\n return (\n prize.distributionWeight === null &&\n Array.isArray(prize.distributionShares) &&\n prize.distributionShares.length === prize.distributionCount &&\n prize.distributionShares.every(isNonNegativeIntegerNumber) &&\n prize.distributionShares.reduce((sum, share) => sum + share, 0) === 10000\n );\n }\n\n if (prize.distributionType === \"uniform\") {\n return prize.distributionWeight === null && prize.distributionShares === null;\n }\n\n return (\n isNonNegativeIntegerNumber(prize.distributionWeight) &&\n prize.distributionShares === null\n );\n}\n\nfunction hasBasePrizeFields(prize: Prize): boolean {\n return (\n isNonNegativeIntegerString(prize.prizeId) &&\n isNonNegativeIntegerString(prize.tournamentId) &&\n Number.isInteger(prize.payoutPosition) &&\n prize.payoutPosition >= 0 &&\n isNonEmptyString(prize.sponsorAddress)\n );\n}\n\nfunction hasExtensionConfig(value: unknown): boolean {\n return (\n value === null ||\n (Array.isArray(value) && value.every((entry) => typeof entry === \"string\"))\n );\n}\n\nfunction describePrize(prize: Prize): string {\n const prizeId = isNonEmptyString(prize.prizeId) ? prize.prizeId : \"<invalid>\";\n return `prizeId=${prizeId}, tokenType=${prize.tokenType}`;\n}\n\nfunction malformedTokenPrizeError(\n action: \"adapt\" | \"read\",\n prize: Prize,\n): TypeError {\n return new TypeError(\n `Cannot ${action} malformed Budokan token prize (${describePrize(prize)})`,\n );\n}\n\nfunction malformedExtensionPrizeError(\n action: \"adapt\",\n prize: Prize,\n): TypeError {\n return new TypeError(\n `Cannot ${action} malformed Budokan extension prize (${\n describePrize(prize)\n })`,\n );\n}\n\nfunction assertMetagameTokenPosition(prize: TokenPrize): void {\n if (Number.isInteger(prize.payoutPosition) && prize.payoutPosition > 0) {\n return;\n }\n\n if (prize.payoutPosition !== 0) {\n throw new TypeError(\n `Cannot adapt Budokan token prize with invalid payout position (${\n describePrize(prize)\n })`,\n );\n }\n\n throw new TypeError(\n `Cannot adapt Budokan token prize with unhydrated payout position (${\n describePrize(prize)\n })`,\n );\n}\n\nfunction assertMetagameExtensionPosition(prize: ExtensionPrize): void {\n if (Number.isInteger(prize.payoutPosition) && prize.payoutPosition > 0) {\n return;\n }\n\n if (prize.payoutPosition !== 0) {\n throw new TypeError(\n `Cannot adapt Budokan extension prize with invalid payout position (${\n describePrize(prize)\n })`,\n );\n }\n\n throw new TypeError(\n `Cannot adapt Budokan extension prize with unhydrated payout position (${\n describePrize(prize)\n })`,\n );\n}\n\nfunction hasHydratedPayoutPosition(prize: Prize): boolean {\n return prize.payoutPosition > 0;\n}\n\nexport function isRawTokenPrize(prize: Prize): prize is TokenPrize {\n if (\n !hasBasePrizeFields(prize) ||\n !isNonEmptyString(prize.tokenAddress)\n ) {\n return false;\n }\n\n return prize.tokenType === \"erc20\"\n ? isNonNegativeIntegerString(prize.amount) &&\n prize.tokenId === null &&\n prize.extensionAddress === null &&\n prize.extensionConfig === null &&\n hasValidDistributionFields(prize)\n : prize.tokenType === \"erc721\" &&\n prize.amount === null &&\n isNonNegativeIntegerString(prize.tokenId) &&\n prize.extensionAddress === null &&\n prize.extensionConfig === null &&\n hasNoDistributionFields(prize);\n}\n\nexport function isRawExtensionPrize(prize: Prize): prize is ExtensionPrize {\n return (\n hasBasePrizeFields(prize) &&\n prize.tokenType === \"extension\" &&\n prize.tokenAddress === null &&\n prize.amount === null &&\n prize.tokenId === null &&\n hasNoDistributionFields(prize) &&\n isNonEmptyString(prize.extensionAddress) &&\n hasExtensionConfig(prize.extensionConfig)\n );\n}\n\nexport function isTokenPrize(prize: Prize): prize is TokenPrize {\n return isRawTokenPrize(prize) && hasHydratedPayoutPosition(prize);\n}\n\nexport function isExtensionPrize(prize: Prize): prize is ExtensionPrize {\n return isRawExtensionPrize(prize) && hasHydratedPayoutPosition(prize);\n}\n\n/**\n * Returns true when a prize is a valid Budokan token/extension prize and has a\n * hydrated leaderboard position suitable for the metagame prize shape.\n */\nexport function isMetagameAdaptablePrize(\n prize: Prize,\n): prize is TokenPrize | ExtensionPrize {\n return isTokenPrize(prize) || isExtensionPrize(prize);\n}\n\n/**\n * Returns validated raw token prizes. Extension records are skipped without\n * validation; malformed `erc20`/`erc721` records throw instead of being\n * silently dropped. RPC records with `payoutPosition === 0` are returned here\n * for raw token-prize visibility.\n */\nexport function getRawTokenPrizes(prizes: readonly Prize[]): TokenPrize[] {\n return prizes.flatMap((prize) => {\n if (isRawTokenPrize(prize)) return [prize];\n if (prize.tokenType === \"extension\") return [];\n\n throw malformedTokenPrizeError(\"read\", prize);\n });\n}\n\n/**\n * Returns validated hydrated token prizes. Extension records are skipped\n * without validation, and valid raw token prizes with `payoutPosition === 0`\n * are skipped; malformed `erc20`/`erc721` records throw instead of being\n * silently dropped.\n */\nexport function getTokenPrizes(prizes: readonly Prize[]): TokenPrize[] {\n return prizes.flatMap((prize) => {\n if (isTokenPrize(prize)) return [prize];\n if (isRawTokenPrize(prize) || prize.tokenType === \"extension\") return [];\n\n throw malformedTokenPrizeError(\"read\", prize);\n });\n}\n\n/**\n * Converts a guard-validated Budokan token prize into the Metagame SDK token\n * prize shape. Metagame token prizes do not carry Budokan distribution fields,\n * so distributed ERC20 prizes are represented by their aggregate `amount` at\n * `payoutPosition`; use the original Budokan `Prize` for payout-split math.\n * For ERC721 prizes, metagame-sdk@0.1.13 uses `amount` to carry the token ID.\n * Throws when `payoutPosition` is zero because the RPC path uses zero for\n * unhydrated token-prize positions and metagame positions are leaderboard slots.\n */\nexport function toMetagameTokenPrize(\n prize: TokenPrize,\n): MetagameTokenPrize {\n assertMetagameTokenPosition(prize);\n if (!isRawTokenPrize(prize)) {\n throw malformedTokenPrizeError(\"adapt\", prize);\n }\n\n const adapted = {\n id: prize.prizeId,\n position: prize.payoutPosition,\n tokenAddress: prize.tokenAddress,\n tokenType: prize.tokenType,\n // Metagame token prizes use `amount` as the token id for ERC721 entries.\n amount: prize.tokenType === \"erc20\" ? prize.amount : prize.tokenId,\n sponsorAddress: prize.sponsorAddress,\n } satisfies MetagameTokenPrize;\n\n return adapted;\n}\n\n/**\n * Converts a guard-validated Budokan extension prize into the Metagame SDK\n * extension-prize shape. Throws when `payoutPosition` is zero because metagame\n * positions are leaderboard slots and the RPC path uses zero for unhydrated\n * prize positions.\n */\nexport function toMetagameExtensionPrize(\n prize: ExtensionPrize,\n): MetagameExtensionPrize {\n assertMetagameExtensionPosition(prize);\n if (!isRawExtensionPrize(prize)) {\n throw malformedExtensionPrizeError(\"adapt\", prize);\n }\n\n const adapted = {\n id: prize.prizeId,\n position: prize.payoutPosition,\n tokenAddress: null,\n tokenType: \"extension\",\n amount: null,\n sponsorAddress: prize.sponsorAddress,\n extensionAddress: prize.extensionAddress,\n extensionConfig: prize.extensionConfig,\n } satisfies MetagameExtensionPrize;\n\n return adapted;\n}\n\n/**\n * Converts supported Budokan prize variants into Metagame SDK prize shapes.\n * Throws when a prize has malformed fields or an unhydrated payout position.\n * Raw-but-valid zero-position prizes throw the unhydrated-position error.\n * See `toMetagameTokenPrize` for token prize distribution behavior.\n */\nexport function toMetagamePrize(\n prize: Prize,\n): MetagamePrizeLike {\n if (isRawTokenPrize(prize)) return toMetagameTokenPrize(prize);\n if (isRawExtensionPrize(prize)) return toMetagameExtensionPrize(prize);\n\n throw new TypeError(\n `Cannot adapt malformed Budokan prize (${describePrize(prize)})`,\n );\n}\n\n/**\n * Non-throwing metagame adapter. Returns null for malformed prize records and\n * for valid RPC-sourced prizes whose `payoutPosition` is not hydrated yet.\n */\nexport function tryToMetagamePrize(\n prize: Prize,\n): MetagamePrizeLike | null {\n if (!isMetagameAdaptablePrize(prize)) return null;\n return prize.tokenType === \"extension\"\n ? toMetagameExtensionPrize(prize)\n : toMetagameTokenPrize(prize);\n}\n\n/**\n * Converts supported Budokan prize variants into Metagame SDK prize shapes.\n * Throws when any prize has malformed fields or an unhydrated payout position.\n * See `toMetagameTokenPrize` for token prize distribution behavior.\n */\nexport function toMetagamePrizes(\n prizes: readonly Prize[],\n): MetagamePrizeLike[] {\n return prizes.map(toMetagamePrize);\n}\n\n/**\n * Non-throwing batch metagame adapter. Skips malformed records and valid\n * RPC-sourced prizes whose `payoutPosition` is not hydrated yet.\n */\nexport function tryToMetagamePrizes(\n prizes: readonly Prize[],\n): MetagamePrizeLike[] {\n return prizes.flatMap((prize) => {\n const adapted = tryToMetagamePrize(prize);\n return adapted ? [adapted] : [];\n });\n}\n\n/**\n * Converts Budokan token prizes into Metagame SDK token prize shapes. Extension\n * records are skipped without validation. Throws for malformed token records\n * and unhydrated token positions. See `toMetagameTokenPrize` for distribution\n * behavior.\n */\nexport function toMetagameTokenPrizes(\n prizes: readonly Prize[],\n): MetagameTokenPrize[] {\n return prizes.flatMap((prize) => {\n if (isRawTokenPrize(prize)) return [toMetagameTokenPrize(prize)];\n if (prize.tokenType === \"extension\") return [];\n\n throw malformedTokenPrizeError(\"adapt\", prize);\n });\n}\n","/**\n * Whitelisted games and per-game metadata. The on-chain denshokan registry\n * is the source of truth for which games *exist*; this whitelist is the\n * subset we recommend / support, plus extra metadata that doesn't live on\n * chain (homepage URL, default fee config, controller-only flag, etc.).\n *\n * Lifted out of the budokan client (formerly\n * `client/src/assets/games/index.tsx`) so other integrations — the\n * Telegram bot in `examples/telegram-controller-bot/`, third-party\n * consumers — can use the same list without copy-pasting.\n *\n * Addresses are stored in canonical normalized form (0x-prefixed,\n * 66 chars, lowercase). Lookups normalize their input.\n */\nimport { normalizeAddress } from \"../utils/address.js\";\nimport type { ChainConfig } from \"../chains/constants.js\";\n\n/** Subset of chain identifiers the whitelist covers. */\nexport type WhitelistChain = \"mainnet\" | \"sepolia\";\n\nexport interface WhitelistedGame {\n /** Canonical 0x-prefixed, 66-char lowercase contract address. */\n contractAddress: string;\n /** Display name. */\n name: string;\n /** Optional remote logo URL. The SDK never bundles binary assets — host externally. */\n imageUrl?: string;\n /** Game's homepage / landing URL. */\n url?: string;\n /** Direct-play URL template. May include `{tokenId}`. */\n playUrl?: string;\n /** Optional spectator URLs. */\n watchLink?: string;\n replayLink?: string;\n /** True if the game requires a Cartridge Controller to play. */\n controllerOnly?: boolean;\n /** Hide from default listings while keeping the metadata around. */\n disabled?: boolean;\n /** Minimum entry fee floor in USD, used as a UX hint at tournament-create time. */\n minEntryFeeUsd?: number;\n /** Recommended ERC-20 token for entry fee on this chain. */\n defaultEntryFeeToken?: string;\n /** Game-creator share of entry fee (basis-points-style — `5` means 5%). */\n defaultGameFeePercentage?: number;\n /** Approximate gas cost per entry, in USD — UX hint only. */\n averageGasCostUsd?: number;\n /** Some game tokens use animated SVG that needs `<object>` rather than `<img>`. */\n objectImage?: boolean;\n /**\n * Score ordering. `true` = lower-is-better (golf-style), `false` = higher-\n * is-better (points-style). Defaults to false when omitted — most games\n * are points-based.\n */\n leaderboardAscending?: boolean;\n /**\n * Whether the game's score is only valid once the game is in a completed\n * (e.g. dead, finished) state. Tournament-creation UIs hide this question\n * when the property of the game is known. Defaults to false.\n */\n leaderboardGameMustBeOver?: boolean;\n}\n\nconst STRK = \"0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d\";\n\nconst MAINNET_GAMES_RAW: readonly WhitelistedGame[] = [\n {\n contractAddress: \"0x4de0351ceab4ecd50be6ee09329b0dcb3b96a9da88cc158f453823a389722fa\",\n name: \"Death Mountain\",\n url: \"https://deathmountain.gg/\",\n playUrl: \"https://deathmountain.gg/play?id=\",\n watchLink: \"https://deathmountain.gg/watch?id=\",\n replayLink: \"https://deathmountain.gg/replay?id=\",\n controllerOnly: true,\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n defaultGameFeePercentage: 5,\n averageGasCostUsd: 0.25,\n },\n {\n contractAddress: \"0x642f228f70b1ca7edb4ab7ff0bab067369c2e276ddc2570ca18802d4e758edc\",\n name: \"zKube\",\n imageUrl: \"https://zkube-budokan-sepolia.vercel.app/assets/logo.png\",\n url: \"https://zkube.io\",\n playUrl: \"https://zkube.io/play/\",\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n },\n];\n\nconst SEPOLIA_GAMES_RAW: readonly WhitelistedGame[] = [\n {\n contractAddress: \"0x04359aee29873cd9603207d29b4140468bac3e042aa10daab2e1a8b2dd60ef7b\",\n name: \"Dark Shuffle\",\n imageUrl: \"https://darkshuffle.dev/favicon.svg\",\n url: \"https://darkshuffle.dev\",\n controllerOnly: true,\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n },\n {\n contractAddress: \"0x07ae26eecf0274aabb31677753ff3a4e15beec7268fa1b104f73ce3c89202831\",\n name: \"Death Mountain\",\n imageUrl: \"https://darkshuffle.dev/favicon.svg\",\n url: \"https://lootsurvivor.io/\",\n playUrl: \"https://lootsurvivor.io/survivor/play?id=\",\n controllerOnly: true,\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n },\n {\n contractAddress: \"0x012ccc9a2d76c836d088203f6e9d62e22d1a9f7479d1aea8b503a1036c0f4487\",\n name: \"Nums\",\n url: \"https://nums-blond.vercel.app/\",\n playUrl: \"https://nums-blond.vercel.app/\",\n controllerOnly: true,\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n },\n {\n contractAddress: \"0x3a2ea07f0f49c770035eed9a010eb3d1e1bc3cb92e1d47eef2ad75a25c6bdb2\",\n name: \"Number Guess\",\n url: \"https://funfactory.gg/games/1\",\n playUrl: \"https://funfactory.gg/tokens/{tokenId}/play\",\n controllerOnly: true,\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n objectImage: true,\n },\n {\n contractAddress: \"0x5e02a1f750b3fa0e835d454705b664ecb23166cdb49459b1c96c1e3eaf9a2f4\",\n name: \"zKube\",\n imageUrl: \"https://zkube-budokan-sepolia.vercel.app/assets/logo.png\",\n url: \"https://zkube-budokan-sepolia.vercel.app\",\n playUrl: \"https://zkube-budokan-sepolia.vercel.app/play/\",\n controllerOnly: true,\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n },\n];\n\n// Normalize once at module load — addresses in the source list above are\n// inconsistently padded; storing canonical form simplifies lookups.\nconst MAINNET_GAMES: readonly WhitelistedGame[] = MAINNET_GAMES_RAW.map(canonicalize);\nconst SEPOLIA_GAMES: readonly WhitelistedGame[] = SEPOLIA_GAMES_RAW.map(canonicalize);\n\nfunction canonicalize(game: WhitelistedGame): WhitelistedGame {\n return {\n ...game,\n contractAddress: normalizeAddress(game.contractAddress),\n defaultEntryFeeToken: game.defaultEntryFeeToken\n ? normalizeAddress(game.defaultEntryFeeToken)\n : undefined,\n };\n}\n\n/**\n * Whitelisted games for a chain, sorted by name with disabled entries last.\n *\n * Returns a frozen copy — mutations don't bleed back into the module state.\n */\nexport function getWhitelistedGames(chain: WhitelistChain): WhitelistedGame[] {\n const list = chain === \"mainnet\" ? MAINNET_GAMES : SEPOLIA_GAMES;\n // Clone the objects, not just the array, so a caller mutating a returned\n // game can't corrupt the module's canonical entries (and future lookups).\n return list.map((g) => ({ ...g })).sort((a, b) => {\n const aDisabled = a.disabled ?? false;\n const bDisabled = b.disabled ?? false;\n if (aDisabled !== bDisabled) return aDisabled ? 1 : -1;\n return a.name.localeCompare(b.name);\n });\n}\n\n/**\n * Look up a single whitelisted game by contract address. Address is normalized\n * before comparison so callers can pass any padding.\n */\nexport function findWhitelistedGame(\n chain: WhitelistChain,\n contractAddress: string,\n): WhitelistedGame | undefined {\n const target = normalizeAddress(contractAddress);\n return getWhitelistedGames(chain).find((g) => g.contractAddress === target);\n}\n\n/** True if the given game is on the whitelist. */\nexport function isGameWhitelisted(chain: WhitelistChain, contractAddress: string): boolean {\n return findWhitelistedGame(chain, contractAddress) !== undefined;\n}\n\n/**\n * Defaults block — what UI surfaces should pre-fill when the user picks this\n * game. Falls back to per-chain sensible defaults (STRK as fee token, 1% fee,\n * $0.25 minimum) when the game isn't whitelisted, so callers don't have to\n * special-case missing entries.\n */\nexport interface GameDefaults {\n minEntryFeeUsd: number;\n defaultEntryFeeToken: string;\n defaultGameFeePercentage: number;\n averageGasCostUsd: number | undefined;\n /** Inherited leaderboard ordering (true = lower wins, false = higher wins). */\n leaderboardAscending: boolean;\n /** Inherited \"must finish game before submitting\" flag. */\n leaderboardGameMustBeOver: boolean;\n}\n\nexport function getGameDefaults(\n chain: WhitelistChain,\n contractAddress: string,\n): GameDefaults {\n const game = findWhitelistedGame(chain, contractAddress);\n return {\n minEntryFeeUsd: game?.minEntryFeeUsd ?? 0.25,\n defaultEntryFeeToken: game?.defaultEntryFeeToken ?? STRK,\n defaultGameFeePercentage: game?.defaultGameFeePercentage ?? 1,\n averageGasCostUsd: game?.averageGasCostUsd,\n leaderboardAscending: game?.leaderboardAscending ?? false,\n leaderboardGameMustBeOver: game?.leaderboardGameMustBeOver ?? false,\n };\n}\n\n// Re-export so consumers don't have to reach into chains/.\nexport type { ChainConfig };\n","/**\n * Calldata builders for Budokan's on-chain entrypoints.\n *\n * Each builder is a pure function that returns a starknet.js `Call` —\n * `{ contractAddress, entrypoint, calldata }` — without signing or\n * executing anything. Callers pass the returned Call to\n * `account.execute([...])` themselves so this module is decoupled from\n * how an integrator obtains an account (controller, sessions, agent\n * wallets, signing servers).\n *\n * Cairo encoding gotchas this module hides from callers:\n * - Option<T> and custom enums must be wrapped in `CairoOption` /\n * `CairoCustomEnum`. Plain `{ type, variant }` objects look right but\n * CallData.compile treats them as generic structs and serializes the\n * type-name string as a ByteArray — i.e. produces garbage calldata.\n * - `Metadata.description` is a ByteArray (3+ felts). A plain JS\n * string becomes a single felt and the deserializer reverts with\n * \"Failed to deserialize param\".\n * - Cairo enum variant tags are 0-indexed in declaration order; the\n * manually-built calldata in enter/claim/submit follows this order\n * exactly. References:\n * contracts/packages/interfaces/src/budokan.cairo (RewardType,\n * EntryFeeRewardType, EntryRequirementType, Distribution)\n * game-components/.../prize.cairo (PrizeType)\n *\n * Used today by the Telegram bot in\n * `examples/telegram-controller-bot/`. Any other integration that needs\n * to drive the same contract (a Discord bot, a CLI, agent code) should\n * import from here so we don't fork the encoding logic again.\n */\n\nimport {\n byteArray,\n CairoCustomEnum,\n CairoOption,\n CairoOptionVariant,\n CallData,\n hash,\n num,\n uint256,\n} from \"starknet\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface Call {\n contractAddress: string;\n entrypoint: string;\n calldata: string[];\n}\n\n/**\n * Shape of the entry-fee distribution. Mirrors the Cairo `Distribution`\n * enum (Linear / Exponential / Uniform / Custom). The integer `weight`\n * is in client units — the encoder scales it ×10 to match the on-chain\n * convention the budokan client uses, so distributions created via this\n * SDK and via budokan.gg render identically.\n */\nexport type DistributionSpec =\n | { kind: \"linear\"; weight: number }\n | { kind: \"exponential\"; weight: number }\n | { kind: \"uniform\" };\n\nexport interface EntryFeeArgs {\n tokenAddress: string;\n /** Raw u128 amount in smallest token units (decimal string). */\n amount: string;\n /** All shares are basis points (0–10000). Sum + leaderboard pool = 10000. */\n tournamentCreatorShare: number;\n gameCreatorShare: number;\n refundShare: number;\n distribution: DistributionSpec;\n /** Number of top placements that share the leaderboard pool. */\n distributionCount: number;\n}\n\n/**\n * Entry-requirement gating. Two variants on the chain's\n * EntryRequirementType enum:\n * - token: ContractAddress — must own a token from this contract\n * - extension: ExtensionConfig — validator contract + config Span\n *\n * For \"extension\" callers build the `config` Span<felt252> in the exact\n * felt order the target validator's `add_config` expects (see\n * `src/extensions` for preset builders that produce this for the\n * shared deployed validators).\n */\nexport type EntryRequirementSpec =\n | { kind: \"token\"; tokenAddress: string }\n | { kind: \"extension\"; address: string; config: string[] };\n\nexport interface EntryRequirementArgs {\n /** Max entries per qualifying token / extension match. */\n entryLimit: number;\n type: EntryRequirementSpec;\n}\n\nexport interface EnterTournamentArgs {\n tournamentId: string;\n /**\n * Mint recipient. Encoded as `Option<ContractAddress>` — omit for\n * `None` (the contract defaults the mint to the caller).\n */\n playerAddress?: string;\n /** Optional felt252 short string (≤31 ASCII bytes). Omit → Option::None. */\n playerName?: string;\n /**\n * Third-party qualifier to claim, as `Option<ContractAddress>`. Omit for\n * `None` (caller is the qualifier — the common path). Only needed for\n * sponsor flows against gated tournaments.\n */\n qualifier?: string;\n /**\n * `entry_fee_pay_params` (`Option<Span<felt252>>`). Required only for\n * tournaments with an `EntryFeeKind::Extension` fee — the felts the fee\n * extension expects. Omit for the built-in fee flow (Option::None).\n */\n entryFeePayParams?: string[];\n salt?: number;\n metadataValue?: number;\n}\n\nexport interface CreateTournamentArgs {\n creatorRewardsAddress: string;\n /** ≤31 ASCII bytes (felt252 short string). */\n name: string;\n description: string;\n gameAddress: string;\n settingsId: number;\n schedule: {\n registrationStartDelay: number;\n registrationEndDelay: number;\n gameStartDelay: number;\n gameEndDelay: number;\n submissionDuration: number;\n };\n leaderboard: { ascending: boolean; gameMustBeOver: boolean };\n /** Encoded as Option::Some(EntryFeeKind::BuiltIn(EntryFee)) when set. */\n entryFee?: EntryFeeArgs;\n /** Encoded as Option::Some(EntryRequirement) on chain when set. */\n entryRequirement?: EntryRequirementArgs;\n salt?: number;\n metadataValue?: number;\n}\n\n/**\n * Token prize payload. Mirrors the Cairo `TokenTypeData` enum.\n *\n * - `erc20` — fungible. `amount` is required; `distribution` optional\n * (undefined → single winner-takes-all payout). When `distribution`\n * is set, `distributionCount` is required (number of paid positions).\n * - `erc721` — single NFT. `tokenId` is the u128 id of the token the\n * sponsor is escrowing.\n */\nexport type TokenTypeSpec =\n | {\n kind: \"erc20\";\n /** Raw u128 amount (decimal string). */\n amount: string;\n distribution?: DistributionSpec;\n distributionCount?: number;\n }\n | { kind: \"erc721\"; tokenId: string };\n\n/**\n * Tagged union mirroring the on-chain `Prize` enum.\n *\n * - `config` — built-in path: sponsor escrows an ERC20/ERC721 prize via\n * the budokan PrizeComponent; `position` selects a leaderboard slot\n * for non-distributed prizes (ignored for distributed ERC20).\n * - `extension` — external `IPrizeExtension`: budokan forwards the\n * `config` blob to `IPrizeExtension.add_prize`. `position` is ignored\n * (the extension owns position semantics).\n */\nexport type PrizeSpec =\n | {\n kind: \"token\";\n tokenAddress: string;\n tokenType: TokenTypeSpec;\n /** Leaderboard slot for single (non-distributed) prizes. Omit for distributed. */\n position?: number;\n }\n | {\n kind: \"extension\";\n /** Address of the contract implementing `IPrizeExtension`. */\n address: string;\n /** Opaque payload forwarded to `IPrizeExtension.add_prize`. */\n config: string[];\n };\n\nexport interface AddPrizeArgs {\n tournamentId: string;\n prize: PrizeSpec;\n}\n\n/**\n * Tagged union mirroring the Cairo `RewardType` enum hierarchy:\n *\n * variant 0: Prize(PrizeClaim)\n * PrizeClaim variant 0: Token(PrizeType)\n * PrizeType variant 0: Single(u64)\n * PrizeType variant 1: Distributed((u64, u8))\n * PrizeClaim variant 1: Extension({prize_id, position, payout_params})\n * variant 1: EntryFee(EntryFeeClaim)\n * EntryFeeClaim variant 0: Token(EntryFeeRewardType)\n * EntryFeeRewardType variant 0: Position(u32)\n * EntryFeeRewardType variant 1: TournamentCreator\n * EntryFeeRewardType variant 2: GameCreator\n * EntryFeeRewardType variant 3: Refund(felt252)\n * EntryFeeClaim variant 1: Extension(ExtensionEntryFeeClaim)\n *\n * Extension claims are pure pass-through on the host: budokan forwards\n * `(token_id, payout_params)` to the extension and lets it resolve\n * recipient + eligibility from its own state. Callers don't supply\n * recipient or position — the extension derives them.\n *\n * Conventions:\n * - `tokenId` is the game token claiming. Positional extensions\n * (NFTPrize, NFTEntryFee) use it to look up the leaderboard\n * position; ownership-based extensions use it to derive the\n * recipient via `owner_of`.\n * - `tokenId: undefined` signals a non-claim flow (sponsor refund,\n * dao distribution, raffle draw). The extension extracts whatever\n * it needs from `payoutParams` / `claimParams` — e.g. NFTPrize\n * reads `payoutParams[0]` as the slot index to refund.\n */\nexport type RewardType =\n | { kind: \"prize_single\"; prizeId: string }\n | { kind: \"prize_distributed\"; prizeId: string; payoutPosition: number }\n | {\n kind: \"prize_extension\";\n prizeId: string;\n /**\n * Game token claiming the prize, or undefined for non-claim flows\n * (sponsor refunds, raffle draws, etc.).\n */\n tokenId?: string;\n payoutParams: string[];\n }\n | { kind: \"entry_fee_position\"; position: number }\n | { kind: \"entry_fee_tournament_creator\" }\n | { kind: \"entry_fee_game_creator\" }\n | { kind: \"entry_fee_protocol_fee\" }\n | { kind: \"entry_fee_refund\"; tokenId: string }\n | {\n kind: \"entry_fee_extension\";\n /**\n * Game token claiming the fee-pool share, or undefined for\n * non-claim flows (sponsor refunds, creator shares, etc.).\n */\n tokenId?: string;\n claimParams: string[];\n };\n\n// ---------------------------------------------------------------------------\n// ERC20\n// ---------------------------------------------------------------------------\n\n/** Standard ERC20 `approve(spender, amount)` call. */\nexport function buildErc20ApproveCall(\n tokenAddress: string,\n spender: string,\n amount: string,\n): Call {\n return {\n contractAddress: tokenAddress,\n entrypoint: \"approve\",\n calldata: CallData.compile([spender, uint256.bnToUint256(amount)]),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Budokan entrypoints\n// ---------------------------------------------------------------------------\n\n/**\n * `enter_tournament(tournament_id: u64, player_name: Option<felt252>,\n * player_address: Option<ContractAddress>,\n * qualifier: Option<ContractAddress>,\n * qualification: Option<QualificationProof>,\n * entry_fee_pay_params: Option<Span<felt252>>,\n * salt: u16, metadata_value: u16)`\n *\n * Targets the current budokan contract (#264/#269). `qualification` and\n * `entry_fee_pay_params` are always `None` here — gated/extension-fee\n * tournaments need a real proof / pay-params payload, which depend on the\n * validator and the caller's runtime state.\n *\n * Returns `(felt252, u32)` on-chain — game_token_id and entry_number — but\n * `execute()` surfaces only the tx hash. Callers can fetch the receipt\n * and parse events if they need the values.\n *\n * Tournaments with a non-trivial entry_requirement (NFT-gated or\n * extension-validator) need a real `QualificationProof` and shouldn't go\n * through this entrypoint — route those via the budokan client UI or\n * implement a qualification-proof builder.\n */\nexport function buildEnterTournamentCall(\n budokanAddress: string,\n args: EnterTournamentArgs,\n): Call {\n // Hand-built calldata. enter_tournament takes a chain of Options (tags:\n // 0 = Some, 1 = None) in this exact ABI order:\n // tournament_id, player_name?, player_address?, qualifier?,\n // qualification?, entry_fee_pay_params?, salt, metadata_value\n const calldata: string[] = [\n num.toHex(args.tournamentId), // tournament_id u64\n ];\n // player_name: Option<felt252>\n if (args.playerName) {\n calldata.push(\"0x0\", felt252FromShortString(args.playerName));\n } else {\n calldata.push(\"0x1\");\n }\n // player_address: Option<ContractAddress> — Some(addr) sets the mint\n // recipient; None defaults to the caller.\n if (args.playerAddress) {\n calldata.push(\"0x0\", args.playerAddress);\n } else {\n calldata.push(\"0x1\");\n }\n // qualifier: Option<ContractAddress> — Some(addr) claims a third-party\n // qualifier; None = caller is the qualifier.\n if (args.qualifier) {\n calldata.push(\"0x0\", args.qualifier);\n } else {\n calldata.push(\"0x1\");\n }\n // qualification: Option<QualificationProof> — only None is supported here.\n // Token / extension qualified tournaments require a real proof, which\n // depends on the validator and on the caller's runtime state.\n calldata.push(\"0x1\");\n // entry_fee_pay_params: Option<Span<felt252>>. Some(span) for\n // EntryFeeKind::Extension tournaments; None for the built-in fee flow.\n if (args.entryFeePayParams && args.entryFeePayParams.length > 0) {\n calldata.push(\n \"0x0\",\n num.toHex(args.entryFeePayParams.length),\n ...args.entryFeePayParams,\n );\n } else {\n calldata.push(\"0x1\");\n }\n calldata.push(num.toHex(args.salt ?? 0)); // salt u16\n calldata.push(num.toHex(args.metadataValue ?? 0)); // metadata_value u16\n return {\n contractAddress: budokanAddress,\n entrypoint: \"enter_tournament\",\n calldata,\n };\n}\n\n/** `submit_score(tournament_id: u64, token_id: felt252, position: u32)` */\nexport function buildSubmitScoreCall(\n budokanAddress: string,\n args: { tournamentId: string; tokenId: string; position: number },\n): Call {\n return {\n contractAddress: budokanAddress,\n entrypoint: \"submit_score\",\n calldata: CallData.compile([args.tournamentId, args.tokenId, args.position]),\n };\n}\n\n/** `claim_reward(tournament_id: u64, reward_type: RewardType)` */\nexport function buildClaimRewardCall(\n budokanAddress: string,\n args: { tournamentId: string; reward: RewardType },\n): Call {\n // Hand-rolled enum encoding: outer tag, then inner tag, then payload.\n // CallData.compile flattens nested arrays, so we build the felt list\n // directly to keep this transparent.\n const calldata: string[] = [num.toHex(args.tournamentId)];\n pushRewardTypeFelts(calldata, args.reward);\n return {\n contractAddress: budokanAddress,\n entrypoint: \"claim_reward\",\n calldata,\n };\n}\n\n/**\n * `create_tournament(creator_rewards_address, metadata, schedule,\n * game_config, entry_fee, entry_requirement,\n * leaderboard_config, salt, metadata_value)`\n *\n * Schedule fields are durations (`registration_end_delay`,\n * `game_end_delay` measured from their respective starts) — *not*\n * absolute offsets from creation. Callers are responsible for the\n * arithmetic; the contract validates min/max bounds itself.\n *\n * Pass `entryFee` / `entryRequirement` as `undefined` for free / open\n * tournaments. Both fields are wrapped in `CairoOption` so\n * `CallData.compile` emits the correct variant tag.\n */\nexport function buildCreateTournamentCall(\n budokanAddress: string,\n args: CreateTournamentArgs,\n): Call {\n const calldata = CallData.compile({\n creator_rewards_address: args.creatorRewardsAddress,\n metadata: {\n // name is a felt252 (≤31 ASCII bytes). starknet.js packs short\n // ASCII strings into a single felt automatically.\n name: args.name,\n // description is a Cairo ByteArray (multi-felt: data words +\n // pending word + pending word length). A plain JS string serializes\n // to a single felt and the deserializer reverts — wrap explicitly.\n description: byteArray.byteArrayFromString(args.description),\n },\n schedule: {\n registration_start_delay: args.schedule.registrationStartDelay,\n registration_end_delay: args.schedule.registrationEndDelay,\n game_start_delay: args.schedule.gameStartDelay,\n game_end_delay: args.schedule.gameEndDelay,\n submission_duration: args.schedule.submissionDuration,\n },\n game_config: {\n game_address: args.gameAddress,\n settings_id: args.settingsId,\n soulbound: false,\n paymaster: false,\n // Options must be CairoOption — see file header for why.\n client_url: new CairoOption<string>(CairoOptionVariant.None),\n renderer: new CairoOption<string>(CairoOptionVariant.None),\n },\n entry_fee: encodeEntryFeeOption(args.entryFee),\n entry_requirement: encodeEntryRequirementOption(args.entryRequirement),\n leaderboard_config: {\n ascending: args.leaderboard.ascending,\n game_must_be_over: args.leaderboard.gameMustBeOver,\n },\n salt: args.salt ?? 0,\n metadata_value: args.metadataValue ?? 0,\n });\n return {\n contractAddress: budokanAddress,\n entrypoint: \"create_tournament\",\n calldata,\n };\n}\n\n/**\n * `add_prize(tournament_id: u64, prize: Prize, position: Option<u32>) -> u64`\n *\n * The `Prize` sum type discriminates between the built-in\n * (ERC20/ERC721) flow and an external `IPrizeExtension` integration —\n * see `PrizeSpec` for the variants.\n *\n * The on-chain entrypoint returns the minted `prize_id` (u64); callers\n * wanting the full payload should subscribe to the `PrizeAdded` event.\n */\nexport function buildAddPrizeCall(\n budokanAddress: string,\n args: AddPrizeArgs,\n): Call {\n const prize = encodePrize(args.prize);\n const position =\n args.prize.kind === \"token\" && args.prize.position !== undefined\n ? new CairoOption<number>(CairoOptionVariant.Some, args.prize.position)\n : new CairoOption<number>(CairoOptionVariant.None);\n const calldata = CallData.compile({\n tournament_id: args.tournamentId,\n prize,\n position,\n });\n return {\n contractAddress: budokanAddress,\n entrypoint: \"add_prize\",\n calldata,\n };\n}\n\nfunction encodePrize(spec: PrizeSpec): CairoCustomEnum {\n // Variant order from interfaces::prize::Prize: Token, Extension.\n // Input payloads (TokenPrizePayload / ExtensionPrizePayload) carry no\n // host-assigned metadata — id/context_id/sponsor_address live on the\n // wrapping PrizeRecord at read time and are filled in by the host.\n if (spec.kind === \"token\") {\n return new CairoCustomEnum({\n Token: {\n token_address: spec.tokenAddress,\n token_type: encodeTokenType(spec.tokenType),\n },\n Extension: undefined,\n });\n }\n // ExtensionPrizePayload { address, config }. CallData.compile\n // serializes string[] as a Span (len + items).\n return new CairoCustomEnum({\n Token: undefined,\n Extension: {\n address: spec.address,\n config: spec.config,\n },\n });\n}\n\nfunction encodeTokenType(spec: TokenTypeSpec): CairoCustomEnum {\n if (spec.kind === \"erc20\") {\n // distribution and distribution_count must agree: a Some(distribution)\n // with a None count is ambiguous calldata that the contract rejects.\n if (spec.distribution && spec.distributionCount === undefined) {\n throw new Error(\n \"TokenTypeSpec.erc20: distributionCount is required when distribution is set\",\n );\n }\n // Inner erc20 data: { amount: u128, distribution: Option<Distribution>,\n // distribution_count: Option<u32> }. Both Options use CairoOption so\n // CallData.compile recognizes them as typed wrappers.\n //\n // Variant keys (`erc20`/`erc721`) match the ABI's TokenTypeData variant\n // names exactly, in declaration order. CallData.compile encodes the\n // variant by position (it's order-based without an ABI), so casing is\n // cosmetic for the wire format — but matching the ABI keeps the encoder\n // self-evidently correct and ABI-aware code paths safe.\n const distribution = spec.distribution\n ? new CairoOption<CairoCustomEnum>(\n CairoOptionVariant.Some,\n encodeDistribution(spec.distribution),\n )\n : new CairoOption<CairoCustomEnum>(CairoOptionVariant.None);\n const distributionCount =\n spec.distribution && spec.distributionCount !== undefined\n ? new CairoOption<number>(\n CairoOptionVariant.Some,\n spec.distributionCount,\n )\n : new CairoOption<number>(CairoOptionVariant.None);\n return new CairoCustomEnum({\n erc20: {\n amount: spec.amount,\n distribution,\n distribution_count: distributionCount,\n },\n erc721: undefined,\n });\n }\n return new CairoCustomEnum({\n erc20: undefined,\n erc721: { id: spec.tokenId },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Internal encoders\n// ---------------------------------------------------------------------------\n\ninterface EntryFeePayload {\n token_address: string;\n amount: string;\n tournament_creator_share: number;\n game_creator_share: number;\n refund_share: number;\n distribution: CairoCustomEnum;\n distribution_count: number;\n}\n\nfunction encodeEntryFeeOption(\n fee: EntryFeeArgs | undefined,\n): CairoOption<CairoCustomEnum> {\n if (!fee) return new CairoOption<CairoCustomEnum>(CairoOptionVariant.None);\n const builtIn: EntryFeePayload = {\n token_address: fee.tokenAddress,\n amount: fee.amount,\n tournament_creator_share: fee.tournamentCreatorShare,\n game_creator_share: fee.gameCreatorShare,\n refund_share: fee.refundShare,\n distribution: encodeDistribution(fee.distribution),\n distribution_count: fee.distributionCount,\n };\n // entry_fee is now Option<EntryFeeKind>, where EntryFeeKind is a sum type\n // { BuiltIn: EntryFee, Extension: ExtensionConfig }. The SDK only builds\n // built-in token fees; wrap the payload in the BuiltIn variant.\n return new CairoOption<CairoCustomEnum>(\n CairoOptionVariant.Some,\n new CairoCustomEnum({ BuiltIn: builtIn, Extension: undefined }),\n );\n}\n\ninterface EntryRequirementPayload {\n entry_limit: number;\n entry_requirement_type: CairoCustomEnum;\n}\n\nfunction encodeEntryRequirementOption(\n req: EntryRequirementArgs | undefined,\n): CairoOption<EntryRequirementPayload> {\n if (!req)\n return new CairoOption<EntryRequirementPayload>(CairoOptionVariant.None);\n return new CairoOption<EntryRequirementPayload>(CairoOptionVariant.Some, {\n entry_limit: req.entryLimit,\n entry_requirement_type: encodeEntryRequirementType(req.type),\n });\n}\n\nfunction encodeEntryRequirementType(\n spec: EntryRequirementSpec,\n): CairoCustomEnum {\n // Variant order from interfaces::entry_requirement::EntryRequirementType:\n // token: ContractAddress, extension: ExtensionConfig\n if (spec.kind === \"token\") {\n return new CairoCustomEnum({\n token: spec.tokenAddress,\n extension: undefined,\n });\n }\n if (spec.kind === \"extension\") {\n // ExtensionConfig { address: ContractAddress, config: Span<felt252> }.\n // CallData.compile serializes string[] as a Span (len + items).\n return new CairoCustomEnum({\n token: undefined,\n extension: {\n address: spec.address,\n config: spec.config,\n },\n });\n }\n throw new Error(\n `Unsupported entry requirement kind: ${(spec as { kind: string }).kind}`,\n );\n}\n\n// On-chain weight is `client weight * 10` (matches the budokan client's\n// formatting.ts convention so percentages match between tournaments\n// created via budokan.gg and via this SDK).\nfunction scaleWeight(client: number): number {\n return Math.round(client * 10);\n}\n\n/**\n * Encode the Distribution enum. Variant order in Cairo: Linear,\n * Exponential, Uniform, Custom — must match declaration order so\n * CallData.compile resolves the right tag. All variants are included\n * with `undefined` for inactive ones so CairoCustomEnum's \"exactly one\n * active variant\" invariant holds.\n */\nfunction encodeDistribution(d: DistributionSpec): CairoCustomEnum {\n if (d.kind === \"linear\") {\n return new CairoCustomEnum({\n Linear: scaleWeight(d.weight),\n Exponential: undefined,\n Uniform: undefined,\n Custom: undefined,\n });\n }\n if (d.kind === \"exponential\") {\n return new CairoCustomEnum({\n Linear: undefined,\n Exponential: scaleWeight(d.weight),\n Uniform: undefined,\n Custom: undefined,\n });\n }\n // Uniform has no payload. CallData.compile emits just the variant tag\n // when unwrap() returns an empty object.\n return new CairoCustomEnum({\n Linear: undefined,\n Exponential: undefined,\n Uniform: {},\n Custom: undefined,\n });\n}\n\nfunction pushRewardTypeFelts(out: string[], reward: RewardType): void {\n // Outer tags: RewardType { Prize=0, EntryFee=1 }\n // Prize inner: PrizeClaim { Token=0, Extension=1 }\n // PrizeClaim::Token inner: PrizeType { Single=0, Distributed=1 }\n // EntryFee inner: EntryFeeClaim { Token=0, Extension=1 }\n // EntryFeeClaim::Token inner: EntryFeeRewardType { Position=0,\n // TournamentCreator=1, GameCreator=2, Refund=3, ProtocolFee=4 }\n switch (reward.kind) {\n case \"prize_single\":\n out.push(\"0x0\", \"0x0\", \"0x0\", num.toHex(reward.prizeId));\n return;\n case \"prize_distributed\":\n out.push(\n \"0x0\",\n \"0x0\",\n \"0x1\",\n num.toHex(reward.prizeId),\n num.toHex(reward.payoutPosition),\n );\n return;\n case \"prize_extension\":\n // ExtensionPrizeClaim { prize_id, token_id: Option<felt252>, payout_params }\n out.push(\"0x0\", \"0x1\", num.toHex(reward.prizeId));\n if (reward.tokenId !== undefined) {\n out.push(\"0x0\", reward.tokenId); // Some(token_id)\n } else {\n out.push(\"0x1\"); // None\n }\n out.push(\n num.toHex(reward.payoutParams.length),\n ...reward.payoutParams.map((p) => num.toHex(p)),\n );\n return;\n case \"entry_fee_position\":\n out.push(\"0x1\", \"0x0\", \"0x0\", num.toHex(reward.position));\n return;\n case \"entry_fee_tournament_creator\":\n out.push(\"0x1\", \"0x0\", \"0x1\");\n return;\n case \"entry_fee_game_creator\":\n out.push(\"0x1\", \"0x0\", \"0x2\");\n return;\n case \"entry_fee_refund\":\n out.push(\"0x1\", \"0x0\", \"0x3\", num.toHex(reward.tokenId));\n return;\n case \"entry_fee_protocol_fee\":\n out.push(\"0x1\", \"0x0\", \"0x4\");\n return;\n case \"entry_fee_extension\": {\n // ExtensionEntryFeeClaim { token_id: Option<felt252>, claim_params }\n out.push(\"0x1\", \"0x1\");\n if (reward.tokenId !== undefined) {\n out.push(\"0x0\", reward.tokenId); // Some(token_id)\n } else {\n out.push(\"0x1\"); // None\n }\n out.push(\n num.toHex(reward.claimParams.length),\n ...reward.claimParams.map((p) => num.toHex(p)),\n );\n return;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Event parsing helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal receipt shape — `events: Array<{ from_address, keys, ... }>`\n * is all `parseTournamentIdFromReceipt` needs and matches what every\n * Starknet RPC / starknet.js `waitForTransaction` returns.\n */\nexport interface ReceiptWithEvents {\n events?: Array<{ from_address?: string; keys?: string[] }>;\n}\n\nconst TOURNAMENT_CREATED_SELECTOR = hash.getSelectorFromName(\n \"TournamentCreated\",\n);\n\n/**\n * Extract the new tournament's id from a `create_tournament` tx receipt\n * by scanning for the `TournamentCreated` event emitted by the budokan\n * contract. The event has the tournament id in its first indexed key\n * (`keys[1]` — `keys[0]` is the selector).\n *\n * Returns the id as a `bigint` (the on-chain type is `u64`, which exceeds\n * JS `Number.MAX_SAFE_INTEGER`, so a lossless type is required — callers\n * deep-linking to a tournament page should `.toString()` it). Returns\n * `undefined` if no matching event is found (e.g. the receipt came from a\n * different call, or the budokan address didn't match).\n *\n * Caller is responsible for fetching the receipt — typically via\n * `account.waitForTransaction(hash)` or `provider.waitForTransaction(hash)`.\n */\nexport function parseTournamentIdFromReceipt(\n receipt: ReceiptWithEvents,\n budokanAddress: string,\n): bigint | undefined {\n const normalise = (addr: string) =>\n addr.toLowerCase().replace(/^0x0*/, \"0x\");\n const normContract = normalise(budokanAddress);\n // Compare selectors numerically so RPC formatting differences\n // (leading-zero padding, casing) don't cause a valid event to be missed.\n const createdSelector = BigInt(TOURNAMENT_CREATED_SELECTOR);\n for (const event of receipt.events ?? []) {\n if (!event.from_address || !event.keys || event.keys.length < 2) continue;\n if (normalise(event.from_address) !== normContract) continue;\n if (BigInt(event.keys[0]!) !== createdSelector) continue;\n return BigInt(event.keys[1]!);\n }\n return undefined;\n}\n\n// Felt252 short-string encoding: ASCII bytes packed big-endian into a felt.\n// Throws if the input is too long (>31 bytes) or non-ASCII.\nfunction felt252FromShortString(s: string): string {\n if (s.length > 31)\n throw new Error(`String too long for felt252: ${s.length} bytes`);\n let value = 0n;\n for (const char of s) {\n const code = char.charCodeAt(0);\n if (code > 0x7f) throw new Error(\"Felt252 short strings must be ASCII\");\n value = (value << 8n) | BigInt(code);\n }\n return \"0x\" + value.toString(16);\n}\n","/**\n * Pure distribution + entry-fee math for Budokan.\n *\n * This module is the single source of truth for \"how much does position N\n * get?\" — the same arithmetic the budokan client used to duplicate in\n * `computeEntryFeeAmount` / `computePrizePercentages` / `processEntryFeePrizes`.\n *\n * All functions are pure: no I/O, no contract calls, no `Date.now()`. Token\n * amounts are `bigint` in smallest token units; basis-point shares are plain\n * numbers (0–10000). USD conversion, decimals, and formatting stay in the\n * consumer.\n *\n * Distribution percentages are computed with the shared `calculateDistribution`\n * from `@provable-games/metagame-sdk` — the *exact* function the budokan client\n * renders payouts with — so amounts match between the SDK, budokan.gg, and any\n * third-party integration. (The final on-chain claim amount is computed by the\n * contract's fixed-point math; these values are the canonical client-side\n * estimate, suitable for display and for filtering unclaimable zero slices.)\n *\n * Entry-fee split semantics follow the contract\n * (`packages/rewards/src/budokan_rewards.cairo::_claim_entry_fee_position`):\n * the position pool is the entry-fee pool **minus** the tournament-creator,\n * game-creator, refund, *and protocol-fee* shares. The client historically\n * omitted the protocol fee here and over-counted the position pool — this\n * module fixes that by taking `protocolFeeShare` as an explicit input.\n */\n\nimport type { Prize } from \"../types/prize.js\";\n\nconst BASIS_POINTS = 10000n;\n\ntype CurveType = \"linear\" | \"exponential\" | \"uniform\";\n\n/**\n * Per-position basis-point curve → percentages (0–100). Ported verbatim from\n * `@provable-games/metagame-sdk`'s `calculateDistribution` (the function the\n * budokan client renders payouts with) so the SDK has no runtime dependency on\n * it and stays the single source of truth. `weight` is in client units (the\n * caller divides the on-chain ×10 weight before passing it here); the\n * normalized rounding dust is rolled into position 1, exactly as on the client.\n */\nfunction calculateDistribution(\n positions: number,\n weight: number,\n distributionType: CurveType,\n): number[] {\n if (positions <= 0) return [];\n\n let raw: number[];\n if (distributionType === \"uniform\") {\n raw = Array(positions).fill(1);\n } else if (distributionType === \"linear\") {\n raw = [];\n for (let i = 0; i < positions; i++) {\n const positionValue = positions - i;\n raw.push(1 + (positionValue - 1) * (weight / 10));\n }\n } else {\n raw = [];\n for (let i = 0; i < positions; i++) {\n raw.push(Math.pow(1 - i / positions, weight));\n }\n }\n\n const total = raw.reduce((a, b) => a + b, 0);\n if (total === 0) return Array(positions).fill(0);\n\n const bpShares = raw.map((d) => Math.floor((d / total) * 1e4));\n const remaining = 1e4 - bpShares.reduce((a, b) => a + b, 0);\n if (remaining !== 0) bpShares[0] = bpShares[0]! + remaining;\n return bpShares.map((bp) => bp / 100);\n}\n\nexport type DistributionKind =\n | \"linear\"\n | \"exponential\"\n | \"uniform\"\n | \"custom\"\n | \"unknown\";\n\nexport interface ParsedDistribution {\n type: DistributionKind;\n /**\n * Raw weight as stored on-chain (scaled ×10 — e.g. `10` = 1.0). `0` for\n * Uniform/Custom. `distributionPercentages` divides by 10 internally.\n */\n weight: number;\n /** For Custom distributions, the raw u16 basis-point shares (one per paid position). */\n customWeights?: number[];\n}\n\nconst KNOWN_KEYS: Record<string, DistributionKind> = {\n linear: \"linear\",\n exponential: \"exponential\",\n uniform: \"uniform\",\n custom: \"custom\",\n};\n\n/**\n * Normalize the many wire shapes of the Cairo `Distribution` enum into a flat\n * `{ type, weight, customWeights }`. Handles:\n * - starknet.js v9 CairoCustomEnum: `{ variant: { Exponential: 100 } }`\n * - SDK / PascalCase: `{ Exponential: 100 }`\n * - lower-cased JSON (indexer/API): `{ exponential: 100 }`\n * - explicit `{ type, weight }`\n * - `Option`-wrapped weights (`{ Some: n }`)\n *\n * Unknown / missing input → `{ type: \"unknown\", weight: 0 }`, which\n * `distributionPercentages` treats as Uniform.\n */\nexport function parseDistribution(dist: unknown): ParsedDistribution {\n if (!dist || typeof dist !== \"object\") {\n return { type: \"unknown\", weight: 0 };\n }\n\n // `{ type, weight }` explicit shape\n const explicit = dist as { type?: string; weight?: number | string };\n if (typeof explicit.type === \"string\") {\n const kind = KNOWN_KEYS[explicit.type.toLowerCase()] ?? \"unknown\";\n return { type: kind, weight: Number(explicit.weight ?? 0) };\n }\n\n // Unwrap a CairoCustomEnum `.variant` layer if present.\n const bag = ((dist as { variant?: Record<string, unknown> }).variant ??\n (dist as Record<string, unknown>)) as Record<string, unknown>;\n\n for (const [rawKey, value] of Object.entries(bag)) {\n if (value === undefined || value === null) continue;\n const kind = KNOWN_KEYS[rawKey.toLowerCase()];\n if (!kind) continue;\n\n if (kind === \"uniform\") return { type: \"uniform\", weight: 0 };\n\n if (kind === \"custom\") {\n const arr = Array.isArray(value) ? value.map((v) => Number(v)) : [];\n return { type: \"custom\", weight: 0, customWeights: arr };\n }\n\n // Linear / Exponential carry a numeric weight.\n if (typeof value === \"number\" || typeof value === \"string\" || typeof value === \"bigint\") {\n return { type: kind, weight: Number(value) };\n }\n if (typeof value === \"object\" && value !== null && \"Some\" in value) {\n return { type: kind, weight: Number((value as { Some: unknown }).Some) };\n }\n return { type: kind, weight: 0 };\n }\n\n return { type: \"unknown\", weight: 0 };\n}\n\n/**\n * Build a `ParsedDistribution` from the flat fields the SDK carries on a\n * sponsored `Prize` (`distributionType` / `distributionWeight` /\n * `distributionShares`).\n */\nexport function prizeDistribution(prize: Pick<\n Prize,\n \"distributionType\" | \"distributionWeight\" | \"distributionShares\"\n>): ParsedDistribution {\n const type = KNOWN_KEYS[String(prize.distributionType ?? \"uniform\").toLowerCase()] ?? \"uniform\";\n if (type === \"custom\") {\n return { type, weight: 0, customWeights: prize.distributionShares ?? [] };\n }\n // Default weight matches the client (10 → 1.0) when missing.\n return { type, weight: prize.distributionWeight ?? 10 };\n}\n\n/**\n * Per-position percentages (each 0–100, summing to ~100) for a distribution\n * across `count` paid positions. Generalizes the client's\n * `computeEntryFeePercentages` / `computePrizePercentages`.\n *\n * - linear/exponential: delegates to metagame-sdk's `calculateDistribution`\n * (weight is divided by 10 to undo the on-chain ×10 scaling).\n * - uniform / unknown: equal split.\n * - custom: raw basis-point shares ÷ 100; falls back to uniform when the\n * shares array length doesn't match `count`.\n */\nexport function distributionPercentages(\n dist: ParsedDistribution,\n count: number,\n): number[] {\n if (count <= 0) return [];\n\n if (dist.type === \"custom\") {\n const cw = dist.customWeights ?? [];\n if (cw.length === count) return cw.map((bp) => bp / 100);\n return calculateDistribution(count, 1, \"uniform\");\n }\n\n const distType: CurveType =\n dist.type === \"linear\" || dist.type === \"exponential\" || dist.type === \"uniform\"\n ? dist.type\n : \"uniform\";\n // Weight is stored ×10 on-chain; `calculateDistribution` expects client units.\n return calculateDistribution(count, dist.weight / 10, distType);\n}\n\n/** Input shape for entry-fee split math. Mirrors the on-chain built-in `EntryFee`\n * plus the per-tournament protocol-fee snapshot (carried on `Tournament`). */\nexport interface EntryFeeSplitInput {\n /** Per-entry fee in smallest token units (decimal string or bigint). */\n amount: string | bigint;\n /** Number of paid entries collected. */\n entryCount: number;\n /** Basis-point shares (0–10000). Omitted / null → 0. */\n tournamentCreatorShare?: number | null;\n gameCreatorShare?: number | null;\n refundShare?: number | null;\n /** Protocol-fee bps snapshotted for the tournament (`Tournament.protocolFeeShare`). */\n protocolFeeShare?: number | null;\n}\n\nexport interface EntryFeeSplit {\n /** Total fee pool = amount × entryCount. */\n total: bigint;\n /** Pool shared across leaderboard positions = floor(availableShare × total / 10000). */\n positionPool: bigint;\n tournamentCreator: bigint;\n gameCreator: bigint;\n refund: bigint;\n protocolFee: bigint;\n /** Basis points left for positions after fixed shares (clamped ≥ 0). */\n availableShareBps: number;\n}\n\nfunction bps(total: bigint, share: number | null | undefined): bigint {\n const b = Number(share ?? 0);\n if (b <= 0) return 0n;\n return (total * BigInt(b)) / BASIS_POINTS;\n}\n\n/**\n * Split a built-in entry-fee pool into its on-chain components. The position\n * pool reserves the tournament-creator, game-creator, refund, *and* protocol\n * fee — matching `_claim_entry_fee_position`'s `available_share`.\n *\n * Note: each component is floored independently (sub-wei dust may not sum to\n * `total`, exactly as on-chain).\n */\nexport function entryFeeSplit(input: EntryFeeSplitInput): EntryFeeSplit {\n const total = BigInt(input.amount ?? 0) * BigInt(input.entryCount ?? 0);\n const creator = Number(input.tournamentCreatorShare ?? 0);\n const game = Number(input.gameCreatorShare ?? 0);\n const refund = Number(input.refundShare ?? 0);\n const protocol = Number(input.protocolFeeShare ?? 0);\n const availableShareBps = Math.max(0, 10000 - creator - game - refund - protocol);\n return {\n total,\n positionPool: (total * BigInt(availableShareBps)) / BASIS_POINTS,\n tournamentCreator: bps(total, creator),\n gameCreator: bps(total, game),\n refund: bps(total, refund),\n protocolFee: bps(total, protocol),\n availableShareBps,\n };\n}\n\n/** The on-chain `EntryFee` distribution shape this module needs to size a\n * position payout. A superset of `EntryFeeSplitInput`. */\nexport interface EntryFeePositionInput extends EntryFeeSplitInput {\n /** Raw on-chain `Distribution` (any wire shape — parsed internally). */\n distribution: unknown;\n /** Number of paid positions (`distribution_count`). */\n distributionCount: number;\n}\n\n/**\n * Amount a single leaderboard `position` (1-indexed) claims from the entry-fee\n * pool. Generalizes the client's `computeEntryFeeAmount` — and fixes its\n * protocol-fee over-count by reserving `protocolFeeShare`.\n *\n * Returns `0n` when the position is outside the paid range, the pool is empty,\n * or the share rounds to zero (the contract makes such positions unclaimable).\n */\nexport function entryFeePositionPayout(\n input: EntryFeePositionInput,\n position: number,\n): bigint {\n const distCount = Number(input.distributionCount ?? 0);\n if (distCount <= 0 || position < 1 || position > distCount) return 0n;\n\n const split = entryFeeSplit(input);\n if (split.positionPool <= 0n) return 0n;\n\n const pcts = distributionPercentages(parseDistribution(input.distribution), distCount);\n const pct = pcts[position - 1] ?? 0;\n if (pct <= 0) return 0n;\n // Carry 4 extra decimals on pct so 0.0001% slices don't vanish (matches client).\n return (split.positionPool * BigInt(Math.floor(pct * 10000))) / 1_000_000n;\n}\n\n/**\n * Amount a single `position` (1-indexed) claims from a distributed sponsored\n * ERC20 prize. Generalizes the client's per-position `computePrizePercentages`\n * + amount slicing. Returns `0n` for non-distributed / non-ERC20 prizes, a\n * position outside the paid range, or a zero slice.\n */\nexport function sponsorPrizePayout(prize: Prize, position: number): bigint {\n if (prize.tokenType !== \"erc20\") return 0n;\n const distCount = Number(prize.distributionCount ?? 0);\n if (distCount <= 0 || position < 1 || position > distCount) return 0n;\n\n const pcts = distributionPercentages(prizeDistribution(prize), distCount);\n const pct = pcts[position - 1] ?? 0;\n if (pct <= 0) return 0n;\n return (BigInt(prize.amount ?? \"0\") * BigInt(Math.floor(pct * 10000))) / 1_000_000n;\n}\n","/**\n * Player reward resolution — \"which rewards can this player still claim, and\n * what `claim_reward` calls assemble them?\"\n *\n * Generalizes the budokan client's `buildPlayerClaimCalls` + `computeEarnings`\n * + `getClaimablePrizes`. Pure: walks placements + prize/entry-fee data +\n * existing claims and returns not-yet-claimed, non-zero rewards plus the\n * `Call`s to claim them (via the tested `buildClaimRewardCall` encoder — so\n * the claim-encoding bug class the SDK was created to kill can't recur).\n *\n * Scope (matches the client): the connected player's own placements only —\n * entry-fee position prizes + sponsored prizes. Creator shares, protocol fee,\n * and per-token refunds are pool/owner concerns, not placement-derived, and\n * are intentionally excluded.\n */\n\nimport { buildClaimRewardCall } from \"../calldata/index.js\";\nimport type { Call, RewardType } from \"../calldata/index.js\";\nimport { entryFeePositionPayout, sponsorPrizePayout } from \"../distribution/index.js\";\nimport { isRawTokenPrize } from \"../utils/prizes.js\";\nimport type { Tournament } from \"../types/tournament.js\";\nimport type { Prize, RewardClaim } from \"../types/prize.js\";\nimport type { PlayerPlacement } from \"../types/player.js\";\n\nexport type ClaimableRewardSource =\n | \"entry_fee_position\"\n | \"sponsor_single\"\n | \"sponsor_distributed\";\n\nexport interface ClaimableReward {\n tournamentId: string;\n /** Human label for UI/telemetry (`tournament.name` or `#id`). */\n tournamentName: string;\n /** Reward descriptor — feed straight to `buildClaimRewardCall` / `buildClaimCalls`. */\n reward: RewardType;\n /** Where the reward comes from (UI grouping / telemetry). */\n source: ClaimableRewardSource;\n /** 1-indexed leaderboard position the reward is for. */\n position: number;\n /** Token contract (ERC20/ERC721). */\n tokenAddress: string | null;\n tokenType: \"erc20\" | \"erc721\";\n /** ERC20 amount in smallest units; `undefined` for ERC721 (one NFT). */\n amount?: bigint;\n /** ERC721 token id, when applicable. */\n tokenId?: string | null;\n}\n\nexport interface GetClaimableRewardsInput {\n placements: PlayerPlacement[];\n tournaments: Tournament[];\n prizes: Prize[];\n /** Existing reward-claim records. Only those with `claimed === true` filter rewards out. */\n existingClaims: RewardClaim[];\n}\n\n/**\n * The not-yet-claimed, non-zero rewards across the player's placements.\n *\n * Skips:\n * - already-claimed rewards (would revert),\n * - 0-amount ERC20 slices (contract truncation makes them unclaimable),\n * - creator/protocol/refund shares (not placement-derived).\n */\nexport function getClaimableRewards(\n input: GetClaimableRewardsInput,\n): ClaimableReward[] {\n const tournamentsById = new Map<string, Tournament>();\n for (const t of input.tournaments) tournamentsById.set(t.id, t);\n\n const prizesByTournament = new Map<string, Prize[]>();\n for (const p of input.prizes) {\n let list = prizesByTournament.get(p.tournamentId);\n if (!list) prizesByTournament.set(p.tournamentId, (list = []));\n list.push(p);\n }\n\n // O(1) \"is this (tournament, reward) already claimed?\" lookup.\n const claimedKeys = new Set<string>();\n for (const c of input.existingClaims) {\n if (!c.claimed) continue;\n const key = rewardClaimKey(c);\n if (key) claimedKeys.add(`${c.tournamentId}:${key}`);\n }\n\n const out: ClaimableReward[] = [];\n\n for (const placement of input.placements) {\n const tournament = tournamentsById.get(placement.tournamentId);\n if (!tournament) continue;\n const tournamentName = tournament.name || `#${tournament.id}`;\n const pos = placement.position;\n\n // ---- Entry-fee position prize ----\n const ef = tournament.entryFee;\n const efDistCount = Number(ef?.distributionCount ?? 0);\n if (ef && ef.tokenAddress && efDistCount >= pos) {\n const claimKey = `${placement.tournamentId}:EntryFee.Position.${pos}`;\n if (!claimedKeys.has(claimKey)) {\n const amount = entryFeePositionPayout(\n {\n amount: ef.amount ?? \"0\",\n entryCount: tournament.entryCount ?? 0,\n tournamentCreatorShare: ef.tournamentCreatorShare,\n gameCreatorShare: ef.gameCreatorShare,\n refundShare: ef.refundShare,\n protocolFeeShare: tournament.protocolFeeShare,\n distribution: ef.distribution,\n distributionCount: efDistCount,\n },\n pos,\n );\n if (amount > 0n) {\n out.push({\n tournamentId: placement.tournamentId,\n tournamentName,\n source: \"entry_fee_position\",\n position: pos,\n tokenAddress: ef.tokenAddress,\n tokenType: \"erc20\",\n amount,\n reward: { kind: \"entry_fee_position\", position: pos },\n });\n }\n }\n }\n\n // ---- Sponsor prizes at this position ----\n for (const prize of prizesByTournament.get(placement.tournamentId) ?? []) {\n // `isRawTokenPrize` (not `isTokenPrize`): distributed prizes legitimately\n // carry `payoutPosition === 0`, which the hydrated `isTokenPrize` guard\n // would reject — dropping every distributed sponsor reward.\n if (!isRawTokenPrize(prize)) continue;\n\n const dc = prize.distributionCount ?? 0;\n const pp = prize.payoutPosition ?? 0;\n const isSingle = pp === pos && dc === 0;\n const isDistributed = dc >= pos && pp === 0;\n if (!isSingle && !isDistributed) continue;\n\n const tokenType: \"erc20\" | \"erc721\" =\n prize.tokenType === \"erc721\" ? \"erc721\" : \"erc20\";\n\n if (isSingle) {\n const claimKey = `${placement.tournamentId}:Prize.Single.${prize.prizeId}`;\n if (claimedKeys.has(claimKey)) continue;\n out.push({\n tournamentId: placement.tournamentId,\n tournamentName,\n source: \"sponsor_single\",\n position: pos,\n tokenAddress: prize.tokenAddress,\n tokenType,\n amount: tokenType === \"erc20\" ? BigInt(prize.amount ?? \"0\") : undefined,\n tokenId: prize.tokenId,\n reward: { kind: \"prize_single\", prizeId: prize.prizeId },\n });\n continue;\n }\n\n // Distributed: ERC20 only (the contract only distributes fungibles).\n const payoutIndex = pos - 1;\n const claimKey = `${placement.tournamentId}:Prize.Distributed.${prize.prizeId}.${payoutIndex}`;\n if (claimedKeys.has(claimKey)) continue;\n const amount = sponsorPrizePayout(prize, pos);\n if (amount <= 0n) continue; // 0-slice → unclaimable on-chain\n out.push({\n tournamentId: placement.tournamentId,\n tournamentName,\n source: \"sponsor_distributed\",\n position: pos,\n tokenAddress: prize.tokenAddress,\n tokenType: \"erc20\",\n amount,\n reward: {\n kind: \"prize_distributed\",\n prizeId: prize.prizeId,\n payoutPosition: payoutIndex,\n },\n });\n }\n }\n\n return out;\n}\n\n/**\n * Turn resolved {@link ClaimableReward}s into `claim_reward` `Call`s for\n * `account.execute([...])`. Order is preserved.\n */\nexport function buildClaimCalls(\n rewards: ClaimableReward[],\n budokanAddress: string,\n): Call[] {\n return rewards.map((r) =>\n buildClaimRewardCall(budokanAddress, {\n tournamentId: r.tournamentId,\n reward: r.reward,\n }),\n );\n}\n\n/**\n * Composite key for the three placement-derived claim kinds the player cares\n * about (Prize::Single, Prize::Distributed, EntryFee::Position). Creator,\n * protocol-fee, and refund kinds aren't placement rewards → `null`.\n */\nfunction rewardClaimKey(c: RewardClaim): string | null {\n switch (c.claimKind) {\n case \"prize_single\":\n return c.prizeId ? `Prize.Single.${c.prizeId}` : null;\n case \"prize_distributed\":\n return c.prizeId != null && c.payoutIndex != null\n ? `Prize.Distributed.${c.prizeId}.${c.payoutIndex}`\n : null;\n case \"entry_fee_position\":\n return c.position != null ? `EntryFee.Position.${c.position}` : null;\n default:\n return null;\n }\n}\n","/**\n * Entry-requirement validator extensions.\n *\n * Thin wrappers on top of @provable-games/metagame-sdk for the four\n * validator presets we recommend for chat / bot integrations:\n *\n * - merkle — Allowlist of addresses via a pre-built merkle tree\n * - erc20Balance — Player must hold ≥ X of some ERC-20\n * - opusTroves — Player must have borrowed ≥ $X CASH on Opus\n * - tournament — Player must have entered / placed in a prior tournament\n *\n * Each `buildXxxConfig` function emits the `Span<felt252>` config array\n * the on-chain validator's `add_config` expects. Pair the array with the\n * validator address (via `extensionAddressFor`) when building an\n * `EntryRequirementArgs` of kind `\"extension\"`.\n *\n * Authoritative on-chain layouts:\n * metagame-extensions/packages/presets/src/entry_requirement/*.cairo\n *\n * u256 values (ERC-20 balance thresholds) are split into low/high felt\n * pairs to match those layouts. CASH amounts for Opus are passed as\n * single felts because they're u128-range in practice.\n */\n\nimport { getExtensionAddresses } from \"@provable-games/metagame-sdk\";\nimport type { WhitelistChain } from \"../games/whitelist.js\";\n\nexport type ExtensionPresetKind =\n | \"merkle\"\n | \"erc20Balance\"\n | \"opusTroves\"\n | \"tournament\";\n\n/** Map our short chain names to the chain IDs metagame-sdk uses. */\nfunction sdkChainId(chain: WhitelistChain): string {\n return chain === \"mainnet\" ? \"SN_MAIN\" : \"SN_SEPOLIA\";\n}\n\n/**\n * Lookup the deployed validator address for a given preset on a given\n * chain. Throws if the metagame-sdk address table doesn't have one — the\n * preset isn't usable on that chain.\n */\nexport function extensionAddressFor(\n chain: WhitelistChain,\n kind: ExtensionPresetKind,\n): string {\n const table = getExtensionAddresses(sdkChainId(chain));\n switch (kind) {\n case \"merkle\":\n if (!table.merkleValidator)\n throw new Error(`No merkleValidator address for ${chain}`);\n return table.merkleValidator;\n case \"erc20Balance\":\n if (!table.erc20BalanceValidator)\n throw new Error(`No erc20BalanceValidator address for ${chain}`);\n return table.erc20BalanceValidator;\n case \"opusTroves\":\n if (!table.opusTrovesValidator)\n throw new Error(`No opusTrovesValidator address for ${chain}`);\n return table.opusTrovesValidator;\n case \"tournament\":\n if (!table.tournamentValidator)\n throw new Error(`No tournamentValidator address for ${chain}`);\n return table.tournamentValidator;\n }\n}\n\nconst U256_MAX = (1n << 256n) - 1n;\n\n/** Split a u256 (as bigint) into [low_128, high_128] felt strings. */\nexport function u256ToLowHigh(value: bigint): [string, string] {\n if (value < 0n) throw new Error(\"u256 cannot be negative\");\n if (value > U256_MAX)\n throw new Error(`Value exceeds u256 max: ${value.toString()}`);\n const MASK = (1n << 128n) - 1n;\n return [(value & MASK).toString(), (value >> 128n).toString()];\n}\n\n// ---------------------------------------------------------------------------\n// ERC20 balance config\n// ---------------------------------------------------------------------------\n\nexport interface Erc20BalanceConfig {\n tokenAddress: string;\n /** Raw u256, smallest units. */\n minThreshold: bigint;\n /** Raw u256, smallest units; 0 = no max. */\n maxThreshold: bigint;\n /** Raw u256, smallest units; 0 = single entry, regardless of balance. */\n valuePerEntry: bigint;\n /** 0 = unlimited (only meaningful when valuePerEntry > 0). */\n maxEntries: number;\n bannable: boolean;\n}\n\n/**\n * Build the felt-string config array.\n *\n * Layout (from erc20_balance_validator.cairo):\n * [token, min_low, min_high, max_low, max_high, vpe_low, vpe_high,\n * max_entries, bannable]\n */\nexport function buildErc20BalanceConfig(cfg: Erc20BalanceConfig): string[] {\n const [minLo, minHi] = u256ToLowHigh(cfg.minThreshold);\n const [maxLo, maxHi] = u256ToLowHigh(cfg.maxThreshold);\n const [vpeLo, vpeHi] = u256ToLowHigh(cfg.valuePerEntry);\n return [\n cfg.tokenAddress,\n minLo, minHi,\n maxLo, maxHi,\n vpeLo, vpeHi,\n String(cfg.maxEntries),\n cfg.bannable ? \"1\" : \"0\",\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Opus Troves config\n// ---------------------------------------------------------------------------\n\nexport interface OpusTrovesConfig {\n /** Specific collateral filters; empty = wildcard (any trove qualifies). */\n assetAddresses: string[];\n /** Min CASH borrowed (raw, 18 decimals). CASH is 1:1 USD. */\n threshold: bigint;\n /** CASH per additional entry; 0 = single entry per qualifying trove. */\n valuePerEntry: bigint;\n /** 0 = unlimited (only meaningful with proportional valuePerEntry > 0). */\n maxEntries: number;\n bannable: boolean;\n}\n\n/**\n * Layout (from opus_troves_validator):\n * [asset_count, ...asset_addresses, threshold, value_per_entry,\n * max_entries, bannable]\n *\n * threshold / value_per_entry are CASH amounts (18 decimals, ≤ u128 range\n * for any reasonable USD value) — passed as single felts, not low/high\n * pairs. This matches the validator's parse (parseOpusTrovesValidatorConfig\n * in metagame-sdk reads them as bigints directly).\n */\nexport function buildOpusTrovesConfig(cfg: OpusTrovesConfig): string[] {\n return [\n String(cfg.assetAddresses.length),\n ...cfg.assetAddresses,\n cfg.threshold.toString(),\n cfg.valuePerEntry.toString(),\n String(cfg.maxEntries),\n cfg.bannable ? \"1\" : \"0\",\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Merkle config\n// ---------------------------------------------------------------------------\n\nexport interface MerkleConfig {\n /** On-chain tree ID from the merkle-validator's create_tree. */\n treeId: number;\n}\n\n/** Layout: [tree_id]. */\nexport function buildMerkleConfig(cfg: MerkleConfig): string[] {\n return [String(cfg.treeId)];\n}\n\n// ---------------------------------------------------------------------------\n// Tournament participation config\n// ---------------------------------------------------------------------------\n\n/** 0 = participated (any entry counts), 1 = won (placed in top N). */\nexport type TournamentRequirementType = \"participated\" | \"won\";\n\n/**\n * How to combine multiple qualifying tournaments. Matches QualifyingMode\n * in metagame-sdk: 0=AtLeastOne, 1=CumulativePerTournament, 2=All,\n * 3=CumulativePerEntry, 4=AllParticipateAnyWin, 5=AllWithCumulative.\n */\nexport interface TournamentValidatorConfig {\n requirement: TournamentRequirementType;\n /** Tournament IDs whose history qualifies. */\n tournamentIds: string[];\n /** Top N positions that count (only used when requirement = \"won\"). */\n topPositions: number;\n /** Default 0 (= AtLeastOne). */\n qualifyingMode?: number;\n}\n\n/**\n * Layout (from tournament_validator):\n * [qualifier_type, qualifying_mode, top_positions, ...tournament_ids]\n * - qualifier_type: 0 = participated, 1 = won\n * - qualifying_mode: 0–5 enum\n * - top_positions: 0 for \"all positions\" (used with participated)\n */\nexport function buildTournamentValidatorConfig(\n cfg: TournamentValidatorConfig,\n): string[] {\n const qualifierType = cfg.requirement === \"won\" ? \"1\" : \"0\";\n const qualifyingMode = String(cfg.qualifyingMode ?? 0);\n const topPositions =\n cfg.requirement === \"won\" ? String(cfg.topPositions) : \"0\";\n return [qualifierType, qualifyingMode, topPositions, ...cfg.tournamentIds];\n}\n"]}
1
+ {"version":3,"sources":["../src/errors/index.ts","../src/utils/retry.ts","../src/api/base.ts","../src/utils/mappers.ts","../src/phase/index.ts","../src/api/tournaments.ts","../src/utils/address.ts","../src/api/games.ts","../src/api/activity.ts","../src/ws/manager.ts","../src/chains/constants.ts","../src/datasource/health.ts","../src/datasource/resolver.ts","../src/rpc/provider.ts","../src/rpc/viewer.ts","../src/rpc/abis/budokanViewer.json","../src/rpc/abis/budokan.json","../src/rpc/budokan.ts","../src/client.ts","../src/utils/prizes.ts","../src/games/whitelist.ts","../src/calldata/index.ts","../src/distribution/index.ts","../src/rewards/index.ts","../src/extensions/index.ts"],"names":["fetchOpts","num","CairoCustomEnum","wrapRpcCall","CallData","uint256","byteArray","CairoOption","CairoOptionVariant","hash","claimKey","getExtensionAddresses"],"mappings":";;;;;;AAAO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAA,EACvC,MAAA;AAAA,EACA,UAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiB,MAAA,EAAgB,UAAA,GAAqB,EAAA,EAAI;AACpE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AACF;AAEO,IAAM,mBAAA,GAAN,cAAkC,YAAA,CAAa;AAAA,EACpD,WAAA,CAAY,UAAU,mBAAA,EAAqB;AACzC,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAEO,IAAM,sBAAA,GAAN,cAAqC,YAAA,CAAa;AAAA,EACvD,WAAA,CAAY,UAAU,mBAAA,EAAqB;AACzC,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AAAA,EACd;AACF;AAEO,IAAM,uBAAA,GAAN,cAAsC,YAAA,CAAa;AAAA,EAC/C,YAAA;AAAA,EAET,YAAY,YAAA,EAAsB;AAChC,IAAA,KAAA,CAAM,CAAA,sBAAA,EAAyB,YAAY,CAAA,CAAE,CAAA;AAC7C,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAAA,EACtB;AACF;AAEO,IAAM,QAAA,GAAN,cAAuB,YAAA,CAAa;AAAA,EAChC,eAAA;AAAA,EAET,WAAA,CAAY,SAAiB,eAAA,EAA0B;AACrD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EACzB;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAA,EACvC,YAAA;AAAA,EACA,aAAA;AAAA,EAET,WAAA,CAAY,cAAqB,aAAA,EAAsB;AACrD,IAAA,KAAA,CAAM,sCAAsC,YAAA,CAAa,OAAO,CAAA,YAAA,EAAe,aAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACtG,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AACF;AAEO,SAAS,oBAAoB,KAAA,EAAyB;AAC3D,EAAA,IAAI,KAAA,YAAiB,yBAAyB,OAAO,IAAA;AACrD,EAAA,IAAI,KAAA,YAAiB,eAAA,IAAmB,KAAA,CAAM,MAAA,IAAU,GAAA,IAAO,MAAM,MAAA,GAAS,GAAA,IAAO,KAAA,CAAM,MAAA,KAAW,GAAA,EAAK;AACzG,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;;;ACrEO,SAAS,gBAAA,CACd,OAAA,EACA,SAAA,EACA,QAAA,EACQ;AACR,EAAA,IAAI,KAAA,GAAQ,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AAC3C,EAAA,IAAI,KAAA,GAAQ,UAAU,KAAA,GAAQ,QAAA;AAC9B,EAAA,MAAM,WAAW,KAAA,GAAQ,CAAA;AACzB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAO,IAAK,KAAA,GAAQ,QAAA,CAAA;AACxC,EAAA,OAAO,QAAA,GAAW,MAAA;AACpB;AAEO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEA,eAAsB,SAAA,CACpB,EAAA,EACA,QAAA,GAAmB,CAAA,EACnB,QAAgB,GAAA,EACJ;AACZ,EAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,QAAA,EAAU,OAAA,EAAA,EAAW;AACnD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AAEZ,MAAA,IAAI,mBAAA,CAAoB,KAAK,CAAA,EAAG;AAC9B,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,IAAI,OAAA,KAAY,WAAW,CAAA,EAAG;AAE9B,MAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AAC1D,MAAA,MAAM,MAAM,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,IAAa,IAAI,mBAAA,CAAoB,6BAA6B,CAAA;AAC1E;;;AC9BA,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,sBAAA,GAAyB,CAAA;AAC/B,IAAM,mBAAA,GAAsB,GAAA;AAK5B,eAAsB,QAAA,CAAY,GAAA,EAAa,OAAA,GAA2B,EAAC,EAAe;AACxF,EAAA,MAAM;AAAA,IACJ,MAAA,GAAS,KAAA;AAAA,IACT,UAAU,EAAC;AAAA,IACX,IAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,GAAU,eAAA;AAAA,IACV,aAAA,GAAgB,sBAAA;AAAA,IAChB,UAAA,GAAa;AAAA,GACf,GAAI,OAAA;AAEJ,EAAA,OAAO,SAAA;AAAA,IACL,YAAY;AACV,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AAG9D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,YAAA,CAAa,SAAS,CAAA;AACtB,UAAA,MAAM,IAAI,oBAAoB,qBAAqB,CAAA;AAAA,QACrD;AACA,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM,UAAA,CAAW,OAAM,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,MAC3E;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAChC,MAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,GAAG;AAAA,WACL;AAAA,UACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,UACpC,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AAED,QAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,UAAA,MAAM,IAAI,eAAA;AAAA,YACP,SAAA,CAAqC,KAAA,IAAS,CAAA,WAAA,EAAc,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,YAC5E,QAAA,CAAS,MAAA;AAAA,YACT,QAAA,CAAS;AAAA,WACX;AAAA,QACF;AAEA,QAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAAA,MAC9B,SAAS,KAAA,EAAO;AACd,QAAA,YAAA,CAAa,SAAS,CAAA;AACtB,QAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,UAAA,MAAM,KAAA;AAAA,QACR;AACA,QAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,UAAA,IAAI,MAAA,EAAQ,OAAA,EAAS,MAAM,IAAI,oBAAoB,qBAAqB,CAAA;AACxE,UAAA,MAAM,IAAI,mBAAA,EAAoB;AAAA,QAChC;AACA,QAAA,MAAM,IAAI,sBAAA;AAAA,UACR,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SAC3C;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AAOO,SAAS,iBAAA,CAAkB,QAAiC,QAAA,EAIjE;AACA,EAAA,MAAM,aAAa,MAAA,CAAO,UAAA;AAC1B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,UAAA,EAAY,KAAA,IAAU,MAAA,CAAO,KAAA;AAAA,IACpC,OAAO,UAAA,EAAY,KAAA,IAAU,MAAA,CAAO,KAAA,IAAgC,UAAU,KAAA,IAAS,EAAA;AAAA,IACvF,QAAQ,UAAA,EAAY,MAAA,IAAW,MAAA,CAAO,MAAA,IAAiC,UAAU,MAAA,IAAU;AAAA,GAC7F;AACF;AAMO,SAAS,iBAAiB,MAAA,EAA8E;AAC7G,EAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAC/B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,MAAA,EAAA,CAAG,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAC3B;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,GAAG,QAAA,EAAS;AACxB,EAAA,OAAO,GAAA,GAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,EAAA;AAC3B;;;ACnHA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,OAAO,GAAA,CAAI,QAAQ,WAAA,EAAa,CAAC,GAAG,MAAA,KAAmB,MAAA,CAAO,aAAa,CAAA;AAC7E;AAKA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,OAAO,GAAA,CAAI,QAAQ,QAAA,EAAU,CAAC,WAAW,CAAA,CAAA,EAAI,MAAA,CAAO,WAAA,EAAa,CAAA,CAAE,CAAA;AACrE;AAKO,SAAS,aAAgB,GAAA,EAAiB;AAC/C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,IAAI,GAAA,CAAI,CAAC,IAAA,KAAS,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,QAAQ,IAAA,IAAQ,OAAO,QAAQ,QAAA,IAAY,EAAE,eAAe,IAAA,CAAA,EAAO;AACrE,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA,EAAG;AACzE,MAAA,MAAA,CAAO,WAAA,CAAY,GAAG,CAAC,CAAA,GAAI,aAAa,KAAK,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,aAAgB,GAAA,EAAiB;AAC/C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,IAAI,GAAA,CAAI,CAAC,IAAA,KAAS,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,QAAQ,IAAA,IAAQ,OAAO,QAAQ,QAAA,IAAY,EAAE,eAAe,IAAA,CAAA,EAAO;AACrE,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA,EAAG;AACzE,MAAA,MAAA,CAAO,WAAA,CAAY,GAAG,CAAC,CAAA,GAAI,aAAa,KAAK,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;;;ACJO,SAAS,eAAA,CACd,GACA,UAAA,EACc;AACd,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,CAAA,CAAE,gBAAA,IAAoB,GAAG,CAAA;AAClD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,GAAG,OAAO,IAAA;AAExC,EAAA,MAAM,gBAAgB,MAAA,CAAO,CAAA,CAAE,0BAA0B,CAAA,CAAE,QAAA,EAAU,0BAA0B,CAAC,CAAA;AAChG,EAAA,MAAM,cAAc,MAAA,CAAO,CAAA,CAAE,wBAAwB,CAAA,CAAE,QAAA,EAAU,wBAAwB,CAAC,CAAA;AAC1F,EAAA,MAAM,iBAAiB,MAAA,CAAO,CAAA,CAAE,kBAAkB,CAAA,CAAE,QAAA,EAAU,kBAAkB,CAAC,CAAA;AACjF,EAAA,MAAM,eAAe,MAAA,CAAO,CAAA,CAAE,gBAAgB,CAAA,CAAE,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAC3E,EAAA,MAAM,qBAAqB,MAAA,CAAO,CAAA,CAAE,sBAAsB,CAAA,CAAE,QAAA,EAAU,sBAAsB,CAAC,CAAA;AAE7F,EAAA,MAAM,MAAM,UAAA,IAAc,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAGtD,EAAA,MAAM,MAAA,GAAS,aAAA,GAAgB,CAAA,IAAK,WAAA,GAAc,CAAA;AAClD,EAAA,MAAM,WAAW,SAAA,GAAY,aAAA;AAC7B,EAAA,MAAM,SAAS,QAAA,GAAW,WAAA;AAC1B,EAAA,MAAM,YAAY,SAAA,GAAY,cAAA;AAC9B,EAAA,MAAM,UAAU,SAAA,GAAY,YAAA;AAC5B,EAAA,MAAM,SAAS,OAAA,GAAU,kBAAA;AAEzB,EAAA,IAAI,MAAA,IAAU,GAAA,GAAM,QAAA,EAAU,OAAO,WAAA;AACrC,EAAA,IAAI,MAAA,IAAU,GAAA,GAAM,MAAA,EAAQ,OAAO,cAAA;AACnC,EAAA,IAAI,GAAA,GAAM,WAAW,OAAO,SAAA;AAC5B,EAAA,IAAI,GAAA,GAAM,SAAS,OAAO,MAAA;AAC1B,EAAA,IAAI,GAAA,GAAM,QAAQ,OAAO,YAAA;AACzB,EAAA,OAAO,WAAA;AACT;;;AC7DA,SAAS,oBAAoB,GAAA,EAA0C;AACrE,EAAA,MAAM,CAAA,GAAI,aAA2C,GAAG,CAAA;AAExD,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,YAAA;AAGrB,EAAA,MAAM,gBAAA,GACJ,CAAA,CAAE,gBAAA,IACD,CAAA,CAAE,UAAmD,gBAAA,IACtD,IAAA;AAEF,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,eAAA,CAAgB,CAAC,CAAA;AAC1C,EAAA,OAAO,EAAE,GAAG,CAAA,EAAG,IAAI,YAAA,EAAc,EAAA,EAAI,kBAAkB,KAAA,EAAM;AAC/D;AAQA,SAAS,UAAU,GAAA,EAA4C;AAC7D,EAAA,OAAO;AAAA,IACL,eAAe,GAAA,EAAK,aAAA;AAAA,IACpB,YAAY,GAAA,EAAK,UAAA;AAAA,IACjB,SAAS,GAAA,EAAK;AAAA,GAChB;AACF;AAKA,eAAsB,cAAA,CACpB,OAAA,EACA,MAAA,EACA,GAAA,EACsC;AACtC,EAAA,MAAM,KAAK,gBAAA,CAAiB;AAAA,IAC1B,cAAc,MAAA,EAAQ,WAAA;AAAA,IACtB,SAAS,MAAA,EAAQ,OAAA;AAAA,IACjB,OAAO,MAAA,EAAQ,KAAA;AAAA,IACf,OAAO,MAAA,EAAQ,KAAA;AAAA,IACf,QAAQ,MAAA,EAAQ,MAAA;AAAA,IAChB,MAAM,MAAA,EAAQ,IAAA;AAAA,IACd,SAAS,MAAA,EAAQ,MAAA;AAAA,IACjB,WAAA,EAAa,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,GAAG,CAAA;AAAA,IACzC,cAAA,EAAgB,MAAA,EAAQ,aAAA,EAAe,IAAA,CAAK,GAAG,CAAA;AAAA,IAC/C,sBAAA,EAAwB,MAAA,EAAQ,qBAAA,EAAuB,IAAA,CAAK,GAAG,CAAA;AAAA,IAC/D,gBAAgB,MAAA,EAAQ;AAAA,GACzB,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAkC,CAAA,EAAG,OAAO,eAAe,EAAE,CAAA,CAAA,EAAI,SAAA,CAAU,GAAG,CAAC,CAAA;AACpG,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,WAAU,GAAI,iBAAA,CAAkB,MAAA,EAAQ,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA;AAChI,EAAA,OAAO;AAAA,IACL,IAAA,EAAO,OAAO,IAAA,CAAmC,GAAA,CAAI,CAAC,IAAA,KAAS,mBAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,IACxF,KAAA;AAAA,IACA,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AACF;AAKA,eAAsB,aAAA,CACpB,OAAA,EACA,YAAA,EACA,GAAA,EACqB;AACrB,EAAA,MAAM,SAAS,MAAM,QAAA;AAAA,IACnB,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,YAAY,CAAA,CAAA;AAAA,IACtC,UAAU,GAAG;AAAA,GACf;AACA,EAAA,OAAO,mBAAA,CAAoB,OAAO,IAAI,CAAA;AACxC;AAUA,eAAsB,0BAAA,CACpB,OAAA,EACA,YAAA,EACA,MAAA,EACA,GAAA,EACwC;AACxC,EAAA,MAAM,KAAK,gBAAA,CAAiB;AAAA,IAC1B,cAAA,EAAgB,QAAQ,YAAA,EAAc,MAAA,GAAS,OAAO,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAAA,IAC/E,eAAe,MAAA,EAAQ,YAAA;AAAA,IACvB,WAAW,MAAA,EAAQ,QAAA;AAAA,IACnB,OAAO,MAAA,EAAQ,KAAA;AAAA,IACf,QAAQ,MAAA,EAAQ;AAAA,GACjB,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAkC,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,YAAY,CAAA,cAAA,EAAiB,EAAE,CAAA,CAAA,EAAI,SAAA,CAAU,GAAG,CAAC,CAAA;AAClI,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,WAAU,GAAI,iBAAA,CAAkB,MAAA,EAAQ,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA;AAChI,EAAA,OAAO;AAAA,IACL,IAAA,EAAO,OAAO,IAAA,CAAmC,GAAA,CAAI,CAAC,IAAA,KAAS,YAAA,CAA2B,IAAI,CAAC,CAAA;AAAA,IAC/F,KAAA;AAAA,IACA,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AACF;AAKA,eAAsB,mBAAA,CACpB,OAAA,EACA,YAAA,EACA,GAAA,EACkB;AAClB,EAAA,MAAM,SAAS,MAAM,QAAA;AAAA,IACnB,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,YAAY,CAAA,OAAA,CAAA;AAAA,IACtC,UAAU,GAAG;AAAA,GACf;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS,YAAA,CAAoB,IAAI,CAAC,CAAA;AAC5D;AAKA,eAAsB,yBAAA,CACpB,OAAA,EACA,YAAA,EACA,MAAA,EACA,GAAA,EACuC;AACvC,EAAA,MAAM,KAAK,gBAAA,CAAiB;AAAA,IAC1B,OAAO,MAAA,EAAQ,KAAA;AAAA,IACf,QAAQ,MAAA,EAAQ;AAAA,GACjB,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAkC,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,YAAY,CAAA,cAAA,EAAiB,EAAE,CAAA,CAAA,EAAI,SAAA,CAAU,GAAG,CAAC,CAAA;AAClI,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,WAAU,GAAI,iBAAA,CAAkB,MAAA,EAAQ,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA;AAChI,EAAA,OAAO;AAAA,IACL,IAAA,EAAO,OAAO,IAAA,CAAmC,GAAA,CAAI,CAAC,IAAA,KAAS,YAAA,CAA0B,IAAI,CAAC,CAAA;AAAA,IAC9F,KAAA;AAAA,IACA,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AACF;AAKA,eAAsB,gCAAA,CACpB,OAAA,EACA,YAAA,EACA,GAAA,EAC6B;AAC7B,EAAA,MAAM,SAAS,MAAM,QAAA;AAAA,IACnB,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,YAAY,CAAA,sBAAA,CAAA;AAAA,IACtC,UAAU,GAAG;AAAA,GACf;AACA,EAAA,OAAO,YAAA,CAAiC,OAAO,IAAI,CAAA;AACrD;AAKA,eAAsB,2BAAA,CACpB,OAAA,EACA,YAAA,EACA,MAAA,EACA,GAAA,EAC8C;AAC9C,EAAA,MAAM,KAAK,gBAAA,CAAiB;AAAA,IAC1B,OAAO,MAAA,EAAQ,KAAA;AAAA,IACf,QAAQ,MAAA,EAAQ;AAAA,GACjB,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAkC,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,YAAY,CAAA,eAAA,EAAkB,EAAE,CAAA,CAAA,EAAI,SAAA,CAAU,GAAG,CAAC,CAAA;AACnI,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,WAAU,GAAI,iBAAA,CAAkB,MAAA,EAAQ,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA;AAChI,EAAA,OAAO;AAAA,IACL,IAAA,EAAO,OAAO,IAAA,CAAmC,GAAA,CAAI,CAAC,IAAA,KAAS,YAAA,CAAiC,IAAI,CAAC,CAAA;AAAA,IACrG,KAAA;AAAA,IACA,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AACF;AAKA,eAAsB,6BAAA,CACpB,OAAA,EACA,YAAA,EACA,GAAA,EAC6B;AAC7B,EAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,EAAE,mBAAA,EAAqB,MAAM,CAAA;AACzD,EAAA,MAAM,SAAS,MAAM,QAAA;AAAA,IACnB,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,YAAY,UAAU,EAAE,CAAA,CAAA;AAAA,IAClD,UAAU,GAAG;AAAA,GACf;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS,YAAA,CAA+B,IAAI,CAAC,CAAA;AACvE;;;AC3MO,SAAS,iBAAiB,OAAA,EAAyB;AACxD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC7C,EAAA,OAAA,CAAQ,OAAO,QAAA,CAAS,QAAA,CAAS,EAAA,EAAI,GAAG,GAAG,WAAA,EAAY;AACzD;;;ACQA,SAASA,WAAU,GAAA,EAA4C;AAC7D,EAAA,OAAO;AAAA,IACL,eAAe,GAAA,EAAK,aAAA;AAAA,IACpB,YAAY,GAAA,EAAK,UAAA;AAAA,IACjB,SAAS,GAAA,EAAK;AAAA,GAChB;AACF;AAKA,eAAsB,kBAAA,CACpB,OAAA,EACA,WAAA,EACA,MAAA,EACA,GAAA,EACsC;AACtC,EAAA,MAAM,UAAA,GAAa,iBAAiB,WAAW,CAAA;AAC/C,EAAA,MAAM,KAAK,gBAAA,CAAiB;AAAA,IAC1B,SAAS,MAAA,EAAQ,OAAA;AAAA,IACjB,OAAO,MAAA,EAAQ,KAAA;AAAA,IACf,OAAO,MAAA,EAAQ,KAAA;AAAA,IACf,QAAQ,MAAA,EAAQ;AAAA,GACjB,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAkC,CAAA,EAAG,OAAO,CAAA,OAAA,EAAU,UAAU,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,EAAIA,UAAAA,CAAU,GAAG,CAAC,CAAA;AACxH,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,WAAU,GAAI,iBAAA,CAAkB,MAAA,EAAQ,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA;AAChI,EAAA,OAAO;AAAA,IACL,IAAA,EAAO,OAAO,IAAA,CAAmC,GAAA,CAAI,CAAC,IAAA,KAAS,YAAA,CAAyB,IAAI,CAAC,CAAA;AAAA,IAC7F,KAAA;AAAA,IACA,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AACF;AAKA,eAAsB,YAAA,CACpB,OAAA,EACA,WAAA,EACA,GAAA,EACwB;AACxB,EAAA,MAAM,UAAA,GAAa,iBAAiB,WAAW,CAAA;AAC/C,EAAA,MAAM,SAAS,MAAM,QAAA;AAAA,IACnB,CAAA,EAAG,OAAO,CAAA,OAAA,EAAU,UAAU,CAAA,MAAA,CAAA;AAAA,IAC9BA,WAAU,GAAG;AAAA,GACf;AACA,EAAA,OAAO,YAAA,CAA4B,OAAO,IAAI,CAAA;AAChD;;;ACnDA,SAASA,WAAU,GAAA,EAA4C;AAC7D,EAAA,OAAO;AAAA,IACL,eAAe,GAAA,EAAK,aAAA;AAAA,IACpB,YAAY,GAAA,EAAK,UAAA;AAAA,IACjB,SAAS,GAAA,EAAK;AAAA,GAChB;AACF;AAKA,eAAsB,gBAAA,CACpB,SACA,GAAA,EACwB;AACxB,EAAA,MAAM,SAAS,MAAM,QAAA;AAAA,IACnB,GAAG,OAAO,CAAA,eAAA,CAAA;AAAA,IACVA,WAAU,GAAG;AAAA,GACf;AACA,EAAA,OAAO,YAAA,CAA4B,OAAO,IAAI,CAAA;AAChD;AAKA,eAAsB,aAAA,CACpB,SACA,GAAA,EACqB;AACrB,EAAA,MAAM,SAAS,MAAM,QAAA;AAAA,IACnB,GAAG,OAAO,CAAA,qBAAA,CAAA;AAAA,IACVA,WAAU,GAAG;AAAA,GACf;AACA,EAAA,OAAO,YAAA,CAAyB,OAAO,IAAI,CAAA;AAC7C;;;ACtCA,IAAM,iBAAA,GAAqC;AAAA,EACzC,oBAAA,EAAsB,EAAA;AAAA,EACtB,kBAAA,EAAoB;AACtB,CAAA;AAKO,IAAM,YAAN,MAAgB;AAAA,EACb,EAAA,GAAuB,IAAA;AAAA,EACd,KAAA;AAAA,EACA,MAAA;AAAA,EACT,iBAAA,GAAoB,CAAA;AAAA,EACpB,gBAAA,GAAyD,IAAA;AAAA,EACzD,aAAA,uBAAoB,GAAA,EAAsE;AAAA,EAC1F,SAAA,GAAY,CAAA;AAAA,EACZ,SAAA,GAAY,KAAA;AAAA,EACZ,mBAAA,uBAA0B,GAAA,EAAkC;AAAA,EAEpE,WAAA,CAAY,OAAe,MAAA,EAAmC;AAC5D,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,iBAAA,EAAmB,GAAG,MAAA,EAAO;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,EAAA,EAAI;AAEb,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,EAAA,GAAK,IAAI,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAElC,MAAA,IAAA,CAAK,EAAA,CAAG,SAAS,MAAM;AACrB,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,QAAA,IAAA,CAAK,uBAAuB,IAAI,CAAA;AAEhC,QAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,KAAK,aAAA,EAAe;AACxC,UAAA,IAAA,CAAK,aAAA,CAAc,IAAI,OAAO,CAAA;AAAA,QAChC;AAAA,MACF,CAAA;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,SAAA,GAAY,CAAC,KAAA,KAAU;AAC7B,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAc,CAAA;AAC/C,UAAA,IAAI,OAAA,CAAQ,SAAS,OAAA,EAAS;AAC5B,YAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,KAAK,aAAA,EAAe;AACxC,cAAA,GAAA,CAAI,QAAQ,OAAO,CAAA;AAAA,YACrB;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAA;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,UAAU,MAAM;AACtB,QAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,QAAA,IAAA,CAAK,uBAAuB,KAAK,CAAA;AACjC,QAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,QAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,MACxB,CAAA;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,UAAU,MAAM;AAAA,MAExB,CAAA;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAClC,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AACA,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,GAAG,OAAA,GAAU,IAAA;AAClB,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,IACZ;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,uBAAuB,KAAK,CAAA;AACjC,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,CAAU,SAA6B,OAAA,EAAqC;AAC1E,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,CAAA;AAClC,IAAA,IAAA,CAAK,cAAc,GAAA,CAAI,EAAA,EAAI,EAAE,OAAA,EAAS,SAAS,CAAA;AAE/C,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,cAAc,OAAO,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,aAAA,CAAc,OAAO,EAAE,CAAA;AAC5B,MAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,EAAA,EAAI;AAC7B,QAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU;AAAA,UAC1B,IAAA,EAAM,aAAA;AAAA,UACN,UAAU,OAAA,CAAQ;AAAA,SACnB,CAAC,CAAA;AAAA,MACJ;AAAA,IACF,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,QAAA,EAAsC;AAC9C,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,CAAA;AAElC,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,EAAA,EAAI;AAAA,MACzB,OAAA,EAAS,EAAE,QAAA,EAAU,EAAC,EAAE;AAAA,MACxB,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,aAAA,CAAc,OAAO,EAAE,CAAA;AAAA,IAC9B,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,QAAA,EAAoD;AACrE,IAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,QAAQ,CAAA;AACrC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,QAAQ,CAAA;AAAA,IAC1C,CAAA;AAAA,EACF;AAAA,EAEQ,uBAAuB,WAAA,EAA4B;AACzD,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,mBAAA,EAAqB;AAC/C,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,WAAW,CAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,OAAA,EAAmC;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,KAAK,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACvD,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACnC,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU;AAAA,MAC1B,IAAA,EAAM,WAAA;AAAA,MACN,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,eAAe,OAAA,CAAQ;AAAA,KACxB,CAAC,CAAA;AAAA,EACJ;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,MAAA,CAAO,oBAAA,EAAsB;AAChE,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,IAAA,KAAS,CAAA,EAAG;AAEnC,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,kBAAA,GAAqB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,iBAAiB,CAAA;AACjF,IAAA,IAAA,CAAK,iBAAA,EAAA;AAEL,IAAA,IAAA,CAAK,gBAAA,GAAmB,WAAW,MAAM;AACvC,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,GAAM,CAAC,CAAA;AAAA,EAC5B;AACF;;;ACjLO,IAAM,MAAA,GAAsC;AAAA,EACjD,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,gCAAA;AAAA,IACR,UAAA,EAAY,+CAAA;AAAA,IACZ,KAAA,EAAO,gDAAA;AAAA,IACP,cAAA,EAAgB,oEAAA;AAAA,IAChB,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,uDAAA;AAAA,IACR,UAAA,EAAY,4CAAA;AAAA,IACZ,KAAA,EAAO,6CAAA;AAAA,IACP,cAAA,EAAgB,oEAAA;AAAA;AAAA;AAAA;AAAA,IAIhB,aAAA,EAAe;AAAA;AAEnB;AAEO,SAAS,eAAe,KAAA,EAAwC;AACrE,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAQO,SAAS,gBAAgB,KAAA,EAAuB;AACrD,EAAA,IAAI,KAAA,KAAU,WAAW,OAAO,gCAAA;AAChC,EAAA,OAAO,wBAAA;AACT;AAGO,SAAS,aAAA,CAAc,OAAe,MAAA,EAAwB;AACnE,EAAA,OAAO,CAAA,EAAG,eAAA,CAAgB,KAAK,CAAC,OAAO,MAAM,CAAA,CAAA;AAC/C;AAGO,SAAS,kBAAA,CAAmB,OAAe,OAAA,EAAyB;AACzE,EAAA,OAAO,CAAA,EAAG,eAAA,CAAgB,KAAK,CAAC,aAAa,OAAO,CAAA,CAAA;AACtD;AAOO,SAAS,iBAAA,CACd,OAGA,YAAA,EACQ;AACR,EAAA,OAAO,CAAA,8BAAA,EAAiC,YAAY,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA;AACvE;;;ACzCO,IAAM,mBAAN,MAAuB;AAAA,EACpB,MAAA,GAAgC;AAAA,IACtC,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,aAAa,CAAA,EAAG,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,IACnE,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,aAAa,CAAA,EAAG,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,IACnE,IAAA,EAAM,KAAA;AAAA,IACN,oBAAA,EAAsB;AAAA,GACxB;AAAA,EAEQ,SAAA,uBAAgB,GAAA,EAAoB;AAAA,EACpC,aAAA,GAAuD,IAAA;AAAA,EACvD,mBAAA,GAA4D,IAAA;AAAA,EAC5D,MAAA;AAAA,EACA,MAAA;AAAA,EACS,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EAEjB,WAAA,CAAY,MAAA,EAAgB,MAAA,EAAgB,MAAA,EAA6B;AACvE,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,iBAAA,IAAqB,KAAO,GAAG,CAAA;AACzE,IAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,aAAA,IAAiB,KAAQ,GAAK,CAAA;AACtE,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,YAAA,IAAgB,KAAO,GAAK,CAAA;AAAA,EACrE;AAAA,EAEA,SAAA,GAAmC;AACjC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA,EAEA,IAAI,IAAA,GAAuB;AACzB,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACrB;AAAA,EAEA,UAAU,QAAA,EAAsC;AAC9C,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AACpB,IAAA,OAAO,MAAM;AAAE,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAAG,CAAA;AAAA,EAClD;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAI,KAAK,aAAA,EAAe;AACxB,IAAA,IAAA,CAAK,mBAAA,GAAsB,WAAW,MAAM;AAC1C,MAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,MAAA,IAAA,CAAK,gBAAgB,WAAA,CAAY,MAAM,KAAK,kBAAA,EAAmB,EAAG,KAAK,eAAe,CAAA;AAAA,IACxF,CAAA,EAAG,KAAK,iBAAiB,CAAA;AAAA,EAC3B;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,aAAA,CAAc,KAAK,aAAa,CAAA;AAChC,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AACA,IAAA,IAAI,KAAK,mBAAA,EAAqB;AAC5B,MAAA,YAAA,CAAa,KAAK,mBAAmB,CAAA;AACrC,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,mBAAmB,KAAA,EAAsB;AACvC,IAAA,IAAA,CAAK,YAAA,CAAa;AAAA,MAChB,GAAA,EAAK,EAAE,GAAG,IAAA,CAAK,OAAO,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,IAAA,CAAK,GAAA,EAAI,EAAG,KAAA,EAAO,SAAS,gBAAA;AAAiB,KACxG,CAAA;AAAA,EACH;AAAA,EAEA,mBAAmB,KAAA,EAAsB;AACvC,IAAA,IAAA,CAAK,YAAA,CAAa;AAAA,MAChB,GAAA,EAAK,EAAE,GAAG,IAAA,CAAK,OAAO,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,IAAA,CAAK,GAAA,EAAI,EAAG,KAAA,EAAO,SAAS,gBAAA;AAAiB,KACxG,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AAAA,EAEA,MAAc,kBAAA,GAAoC;AAChD,IAAA,MAAM,CAAC,SAAA,EAAW,SAAS,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC/C,KAAK,QAAA,EAAS;AAAA,MACd,KAAK,QAAA;AAAS,KACf,CAAA;AACD,IAAA,IAAA,CAAK,YAAA,CAAa,EAAE,GAAA,EAAK,SAAA,EAAW,KAAK,SAAA,EAAW,oBAAA,EAAsB,MAAM,CAAA;AAAA,EAClF;AAAA,EAEA,MAAc,QAAA,GAAmC;AAC/C,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,cAAc,CAAA;AAC1E,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,OAAA,CAAA,EAAW,EAAE,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAQ,CAAA;AACnF,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC7B,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,IAAA,CAAK,GAAA,EAAI,EAAG,OAAA,EAAS,KAAA,EAAO,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA,EAAG;AAAA,MAChG;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,KAAK,MAAA,KAAW,UAAA;AACjE,MAAA,OAAO,EAAE,SAAA,EAAW,WAAA,EAAa,WAAA,EAAa,KAAK,GAAA,EAAI,EAAG,OAAA,EAAS,KAAA,EAAO,WAAA,GAAc,IAAA,GAAO,CAAA,YAAA,EAAe,IAAA,CAAK,MAAM,CAAA,CAAA,EAAG;AAAA,IAC9H,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,KAAK,GAAA,EAAI,EAAG,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAA,EAAgB;AAAA,IACrI;AAAA,EACF;AAAA,EAEA,MAAc,QAAA,GAAmC;AAC/C,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,cAAc,CAAA;AAC1E,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ;AAAA,QACxC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,kBAAA,EAAoB,MAAA,EAAQ,EAAC,EAAG,EAAA,EAAI,GAAG,CAAA;AAAA,QACtF,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AACD,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC7B,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,IAAA,CAAK,GAAA,EAAI,EAAG,OAAA,EAAS,KAAA,EAAO,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA,EAAG;AAAA,MAChG;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,KAAW,KAAA,CAAA,IAAa,CAAC,IAAA,CAAK,KAAA;AACrD,MAAA,OAAO,EAAE,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,CAAK,GAAA,EAAI,EAAG,OAAA,EAAS,KAAA,EAAO,SAAA,GAAY,IAAA,GAAO,WAAA,EAAY;AAAA,IACzG,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,KAAK,GAAA,EAAI,EAAG,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAA,EAAgB;AAAA,IACrI;AAAA,EACF;AAAA,EAEQ,aAAa,OAAA,EAA+C;AAClE,IAAA,MAAM,YAAY,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,OAAA,EAAQ;AAE/C,IAAA,IAAI,SAAA,CAAU,IAAI,SAAA,EAAW;AAC3B,MAAA,SAAA,CAAU,IAAA,GAAO,KAAA;AAAA,IACnB,CAAA,MAAA,IAAW,SAAA,CAAU,GAAA,CAAI,SAAA,EAAW;AAClC,MAAA,SAAA,CAAU,IAAA,GAAO,cAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,IAAA,GAAO,SAAA;AAAA,IACnB;AAEA,IAAA,MAAM,OAAA,GACJ,KAAK,MAAA,CAAO,GAAA,CAAI,cAAc,SAAA,CAAU,GAAA,CAAI,SAAA,IAC5C,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,cAAc,SAAA,CAAU,GAAA,CAAI,SAAA,IAC5C,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,UAAU,IAAA,IAC/B,IAAA,CAAK,MAAA,CAAO,oBAAA,KAAyB,SAAA,CAAU,oBAAA;AAEjD,IAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AAEd,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa;AACnC,QAAA,IAAI;AAAE,UAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAA,QAAe;AAAA,MACtD,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AACF;;;AChLA,eAAsB,YAAA,CACpB,OAAA,EACA,QAAA,EACA,MAAA,EACY;AAEZ,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,IAAI,SAAS,cAAA,EAAgB;AAE3B,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,QAAA,EAAS;AAAA,MACxB,SAAS,aAAA,EAAe;AACtB,QAAA,MAAM,aAAA;AAAA,MACR;AAAA,IACF;AAIA,EACF;AAEA,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,OAAA,EAAQ;AAAA,EACvB,SAAS,KAAA,EAAO;AACd,IAAA,YAAA,GAAe,KAAA;AAEf,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,kBAAA,CAAmB,aAAa,OAAO,CAAA;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EACxB,SAAS,aAAA,EAAe;AACtB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,kBAAA,CAAoB,cAAwB,OAAO,CAAA;AAAA,IAC5D;AACA,IAAA,MAAM,IAAI,eAAA,CAAgB,YAAA,EAAc,aAAsB,CAAA;AAAA,EAChE;AACF;;;AC1CA,IAAI,cAAA,GAAmD,IAAA;AAEvD,eAAe,WAAA,GAAkD;AAC/D,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,cAAA,GAAiB,MAAM,OAAO,UAAU,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,cAAA;AACT;AAEA,eAAsB,cAAA,CACpB,QACA,OAAA,EACsB;AACtB,EAAA,MAAM,EAAE,WAAA,EAAa,mBAAA,EAAoB,GAAI,MAAM,WAAA,EAAY;AAC/D,EAAA,MAAM,QAAA,GAAW,IAAI,mBAAA,CAAoB;AAAA,IACvC,OAAA,EAAS,MAAA;AAAA,IACT,GAAI,OAAA,IAAW,EAAE,OAAA;AAAQ,GAC1B,CAAA;AACD,EAAA,OAAO,QAAA;AACT;AAEA,eAAsB,cAAA,CACpB,GAAA,EACA,OAAA,EACA,QAAA,EACmB;AAEnB,EAAA,IAAI,WAAA,GAAmB,GAAA;AACvB,EAAA,IAAI,GAAA,IAAO,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,KAAK,OAAO,GAAA,KAAQ,QAAA,IAAY,SAAA,IAAa,GAAA,EAAK;AAC7E,IAAA,WAAA,GAAe,GAAA,CAAyB,OAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAY;AAEnC,EAAA,OAAO,IAAI,SAAS,QAAA,CAAS,EAAE,KAAK,WAAA,EAAa,OAAA,EAAS,iBAAA,EAAmB,QAAA,EAAU,CAAA;AACzF;ACpBA,SAAS,WAAA,CAAe,IAAsB,eAAA,EAAsC;AAClF,EAAA,OAAO,EAAA,EAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AACpC,IAAA,MAAM,IAAI,QAAA;AAAA,MACR,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,iBAAA;AAAA,MACzC;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,kBAAkB,KAAA,EAAwB;AACjD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,MAAM,GAAA,GAAMC,YAAA,CAAI,KAAA,CAAM,KAAe,CAAA;AACrC,EAAA,IAAI,GAAA,KAAQ,OAAO,OAAO,EAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AAC1B,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AACzC,IAAA,MAAM,QAAA,GAAW,SAAS,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAAI,CAAC,GAAG,EAAE,CAAA;AACpD,IAAA,IAAI,aAAa,CAAA,EAAG;AACpB,IAAA,MAAA,IAAU,MAAA,CAAO,aAAa,QAAQ,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAgB,KAAA,EAAwB;AAC/C,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,MAAM,cAAc,GAAA,CAAI,YAAA;AACxB,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,GAAA,CAAI,gBAAA,IAAoB,CAAC,CAAA;AAEvD,EAAA,IAAI,MAAA,GAAS,EAAA;AAGb,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,MAAA,MAAM,GAAA,GAAMA,YAAA,CAAI,KAAA,CAAM,KAAe,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA;AAChE,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,KAAK,CAAA,EAAG;AAC9B,QAAA,MAAM,QAAA,GAAW,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,GAAI,CAAC,GAAG,EAAE,CAAA;AACjD,QAAA,IAAI,QAAA,KAAa,CAAA,EAAG,MAAA,IAAU,MAAA,CAAO,aAAa,QAAQ,CAAA;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,IAAe,iBAAiB,CAAA,EAAG;AACrC,IAAA,MAAM,GAAA,GAAMA,YAAA,CAAI,KAAA,CAAM,WAAqB,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA,CAAS,cAAA,GAAiB,CAAA,EAAG,GAAG,CAAA;AACtF,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,cAAA,GAAiB,CAAA,EAAG,KAAK,CAAA,EAAG;AAC9C,MAAA,MAAM,QAAA,GAAW,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,GAAI,CAAC,GAAG,EAAE,CAAA;AACjD,MAAA,IAAI,QAAA,KAAa,CAAA,EAAG,MAAA,IAAU,MAAA,CAAO,aAAa,QAAQ,CAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAGA,IAAM,iBAAiB,CAAC,WAAA,EAAa,gBAAgB,SAAA,EAAW,MAAA,EAAQ,cAAc,WAAW,CAAA;AAEjG,IAAM,cAAA,GAAwC;AAAA,EAC5C,SAAA,EAAW,WAAA;AAAA,EACX,YAAA,EAAc,cAAA;AAAA,EACd,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,UAAA,EAAY,YAAA;AAAA,EACZ,SAAA,EAAW;AACb,CAAA;AAGA,SAAS,cAAc,KAAA,EAA+B;AACpD,EAAA,MAAM,aAAA,GAAgB,eAAe,KAAK,CAAA;AAC1C,EAAA,MAAM,WAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,IAAA,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,KAAM,aAAA,GAAgB,EAAC,GAAI,MAAA;AAAA,EAC3C;AACA,EAAA,OAAO,IAAIC,yBAAgB,QAAQ,CAAA;AACrC;AAMA,SAAS,eAAA,CACP,GAAA,EACA,UAAA,EACA,gBAAA,GAAkC,IAAA,EACtB;AACZ,EAAA,MAAM,GAAA,GAAM,GAAA;AACZ,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,EAAA,IAAM,GAAG,CAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,UAAA,IAAc,CAAC,CAAA;AAC5C,EAAA,MAAM,SAAA,GAAYD,YAAA,CAAI,KAAA,CAAM,GAAA,CAAI,UAAoB,CAAA;AACpD,EAAA,MAAM,iBAAiB,GAAA,CAAI,gBAAA,GAAmBA,aAAI,KAAA,CAAM,GAAA,CAAI,gBAA0B,CAAA,GAAI,IAAA;AAG1F,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,EAAA,MAAM,IAAA,GAAO,QAAA,GAAW,iBAAA,CAAkB,QAAA,CAAS,IAAI,CAAA,GAAI,EAAA;AAC3D,EAAA,MAAM,WAAA,GAAc,QAAA,GAAW,eAAA,CAAgB,QAAA,CAAS,WAAW,CAAA,GAAI,EAAA;AAGvE,EAAA,MAAM,QAAQ,GAAA,CAAI,QAAA;AAClB,EAAA,MAAM,sBAAA,GAAyB,MAAA,CAAO,KAAA,EAAO,wBAAA,IAA4B,CAAC,CAAA;AAC1E,EAAA,MAAM,oBAAA,GAAuB,MAAA,CAAO,KAAA,EAAO,sBAAA,IAA0B,CAAC,CAAA;AACtE,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,KAAA,EAAO,gBAAA,IAAoB,CAAC,CAAA;AAC1D,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,KAAA,EAAO,cAAA,IAAkB,CAAC,CAAA;AACtD,EAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,KAAA,EAAO,mBAAA,IAAuB,CAAC,CAAA;AAGjE,EAAA,MAAM,YAAA,GAAe,OAAO,SAAS,CAAA;AACrC,EAAA,MAAM,WAAW,SAAA,GAAY,sBAAA;AAC7B,EAAA,MAAM,SAAS,QAAA,GAAW,oBAAA;AAC1B,EAAA,MAAM,YAAY,SAAA,GAAY,cAAA;AAC9B,EAAA,MAAM,UAAU,SAAA,GAAY,YAAA;AAC5B,EAAA,MAAM,SAAS,OAAA,GAAU,kBAAA;AACzB,EAAA,MAAM,qBAAA,GAAwB,OAAO,QAAQ,CAAA;AAC7C,EAAA,MAAM,mBAAA,GAAsB,OAAO,MAAM,CAAA;AACzC,EAAA,MAAM,aAAA,GAAgB,OAAO,SAAS,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,OAAO,OAAO,CAAA;AAClC,EAAA,MAAM,iBAAA,GAAoB,OAAO,MAAM,CAAA;AAGvC,EAAA,MAAM,KAAK,GAAA,CAAI,WAAA;AACf,EAAA,MAAM,cAAc,EAAA,GAAKA,YAAA,CAAI,KAAA,CAAM,EAAA,CAAG,YAAsB,CAAA,GAAI,EAAA;AAChE,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,EAAA,EAAI,WAAA,IAAe,CAAC,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,EAAA,EAAI,SAAS,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,EAAA,EAAI,SAAS,CAAA;AACvC,EAAA,MAAM,YAAY,EAAA,EAAI,UAAA,GAAa,uBAAA,CAAwB,EAAA,CAAG,UAAU,CAAA,GAAI,IAAA;AAC5E,EAAA,MAAM,WAAW,EAAA,EAAI,QAAA,GAAW,oBAAA,CAAqB,EAAA,CAAG,QAAQ,CAAA,GAAI,IAAA;AAGpE,EAAA,MAAM,KAAK,GAAA,CAAI,kBAAA;AACf,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,EAAA,EAAI,SAAS,CAAA;AACvC,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,EAAA,EAAI,iBAAiB,CAAA;AAOpD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAG9C,EAAA,IAAI,aAAA,GAA+B,IAAA;AACnC,EAAA,IAAI,cAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,QAAA,GAAmC,IAAA;AACvC,EAAA,IAAI,eAAA,GAA8C,IAAA;AAClD,EAAA,IAAI,iBAAA,GAAqD,IAAA;AACzD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,UAAA,GAAc,aAAa,OAAA,IAAW,YAAA;AAI5C,IAAA,MAAM,KAAK,UAAA,CAAW,OAAA;AACtB,IAAA,MAAM,MAAM,UAAA,CAAW,SAAA;AACvB,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,eAAA,GAAkB,SAAA;AAClB,MAAA,aAAA,GAAgBA,YAAA,CAAI,KAAA,CAAM,EAAA,CAAG,aAAuB,CAAA;AACpD,MAAA,cAAA,GAAiB,MAAA,CAAO,EAAA,CAAG,MAAA,IAAU,GAAG,CAAA;AACxC,MAAA,QAAA,GAAW;AAAA,QACT,YAAA,EAAc,aAAA;AAAA,QACd,MAAA,EAAQ,cAAA;AAAA,QACR,sBAAA,EAAwB,MAAA,CAAO,EAAA,CAAG,wBAAA,IAA4B,CAAC,CAAA;AAAA,QAC/D,gBAAA,EAAkB,MAAA,CAAO,EAAA,CAAG,kBAAA,IAAsB,CAAC,CAAA;AAAA,QACnD,WAAA,EAAa,MAAA,CAAO,EAAA,CAAG,YAAA,IAAgB,CAAC,CAAA;AAAA,QACxC,YAAA,EAAe,GAAG,YAAA,IAAiC,IAAA;AAAA,QACnD,iBAAA,EAAmB,MAAA,CAAO,EAAA,CAAG,kBAAA,IAAsB,CAAC;AAAA,OACtD;AAAA,IACF,WAAW,GAAA,EAAK;AAId,MAAA,eAAA,GAAkB,WAAA;AAClB,MAAA,iBAAA,GAAoB;AAAA,QAClB,OAAA,EAASA,YAAA,CAAI,KAAA,CAAM,GAAA,CAAI,OAAiB,CAAA;AAAA,QACxC,QAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,IAC3B,GAAA,CAAI,MAAA,CAAqB,GAAA,CAAI,CAAC,MAAMA,YAAA,CAAI,KAAA,CAAM,CAAW,CAAC,IAC3D;AAAC,OACP;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,GAAA,CAAI,iBAAiB,CAAA;AAC1D,EAAA,MAAM,sBAAsB,gBAAA,KAAqB,IAAA;AAEjD,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,YAAA,EAAc,EAAA;AAAA,IACd,WAAA;AAAA,IACA,WAAW,IAAI,IAAA,CAAK,SAAA,GAAY,GAAI,EAAE,WAAA,EAAY;AAAA,IAClD,SAAA;AAAA,IACA,cAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAA;AAAA,IACA,sBAAA;AAAA,IACA,oBAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA;AAAA,IACA,gBAAA,EAAkB,YAAA;AAAA,IAClB,qBAAA;AAAA,IACA,mBAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,oBAAA,EAAsB,SAAA;AAAA,IACtB,yBAAA,EAA2B,cAAA;AAAA,IAC3B,aAAA;AAAA,IACA,cAAA;AAAA;AAAA,IAEA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,sBAAA;AAAA,MACA,oBAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,WAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA;AAAA,IACA,YAAA,EAAc,eAAA;AAAA,IACd,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA,EAAmB,EAAE,SAAA,EAAW,cAAA,EAAe;AAAA,IAC/C,OAAO,eAAA,CAAgB;AAAA,MACrB,gBAAA,EAAkB,YAAA;AAAA,MAClB,sBAAA;AAAA,MACA,oBAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD,UAAA;AAAA,IACA,UAAA,EAAY,CAAA;AAAA;AAAA,IACZ,eAAA,EAAiB,CAAA;AAAA;AAAA,IACjB,QAAA,EAAU;AAAA,GACZ;AACF;AAEA,SAAS,sBAAsB,GAAA,EAAgC;AAC7D,EAAA,MAAM,GAAA,GAAM,GAAA;AACZ,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,QAAA,IAAY,CAAC,CAAA;AAAA,IAClC,OAAA,EAASA,YAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAkB;AAAA,GAC3C;AACF;AAEA,SAAS,iBAAA,CAAkB,KAAc,YAAA,EAAoC;AAC3E,EAAA,MAAM,GAAA,GAAM,GAAA;AACZ,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,WAAA,EAAaA,YAAA,CAAI,KAAA,CAAM,GAAA,CAAI,aAAuB,CAAA;AAAA,IAClD,WAAA,EAAa,EAAA;AAAA;AAAA,IACb,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,QAAA,IAAY,CAAC,CAAA;AAAA,IACrC,YAAA,EAAc,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAAA,IACvC,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,SAAS;AAAA,GACjC;AACF;AAEA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,MAAM,MAAA,GAAS,GAAA;AAMf,EAAA,MAAM,YAAY,MAAA,CAAO,KAAA;AACzB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,KAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,WAAA,GACJ,OAAO,SAAA,CAAU,aAAA,KAAkB,aAC9B,SAAA,CAAU,aAAA,EAA+B,GAC1C,SAAA,CAAU,UAAU,MAAA,GAClB,OAAA,GACA,SAAA,CAAU,SAAA,KAAc,SACtB,WAAA,GACA,IAAA;AACV,EAAA,MAAM,eAAA,GAAmB,UAAU,OAAA,IAAW,SAAA;AAK9C,EAAA,IAAI,gBAAgB,WAAA,EAAa;AAC/B,IAAA,MAAM,MAAM,eAAA,CAAgB,SAAA;AAC5B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,EAAA,IAAM,GAAG,CAAA;AAAA,MAChC,YAAA,EAAc,MAAA,CAAO,MAAA,CAAO,UAAA,IAAc,GAAG,CAAA;AAAA,MAC7C,cAAA,EAAgB,CAAA;AAAA,MAChB,YAAA,EAAc,IAAA;AAAA,MACd,SAAA,EAAW,WAAA;AAAA,MACX,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAS,IAAA;AAAA,MACT,gBAAA,EAAkB,IAAA;AAAA,MAClB,kBAAA,EAAoB,IAAA;AAAA,MACpB,kBAAA,EAAoB,IAAA;AAAA,MACpB,iBAAA,EAAmB,IAAA;AAAA,MACnB,cAAA,EAAgBA,YAAA,CAAI,KAAA,CAAM,MAAA,CAAO,eAAyB,CAAA;AAAA,MAC1D,gBAAA,EACE,KAAK,OAAA,IAAW,IAAA,GAAOA,aAAI,KAAA,CAAM,GAAA,CAAI,OAAiB,CAAA,GAAI,IAAA;AAAA,MAC5D,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA,GACrC,GAAA,CAAK,MAAA,CAAqB,GAAA,CAAI,CAAC,CAAA,KAAMA,YAAA,CAAI,KAAA,CAAM,CAAW,CAAC,CAAA,GAC5D;AAAA,KACN;AAAA,EACF;AACA,EAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,KAAK,SAAA,CAAU,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,eAAe,eAAA,CAAgB,KAAA;AACrC,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,KAAK,SAAA,CAAU,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9E;AAEA,EAAA,MAAM,gBAAgB,YAAA,CAAa,UAAA;AAGnC,EAAA,IAAI,SAAA,GAAgC,OAAA;AACpC,EAAA,IAAI,MAAA,GAAwB,IAAA;AAC5B,EAAA,IAAI,OAAA,GAAyB,IAAA;AAC7B,EAAA,IAAI,gBAAA,GAAkC,IAAA;AACtC,EAAA,IAAI,kBAAA,GAAoC,IAAA;AACxC,EAAA,IAAI,kBAAA,GAAsC,IAAA;AAC1C,EAAA,IAAI,iBAAA,GAAmC,IAAA;AAMvC,EAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,EAAA,IAAI,aAAA,EAAe;AAGjB,IAAA,MAAM,aAAA,GAAgB,OAAO,aAAA,CAAc,aAAA,KAAkB,aACxD,aAAA,CAAc,aAAA,EAA+B,GAC9C,aAAA,CAAc,UAAU,MAAA,GAAY,OAAA,GACpC,aAAA,CAAc,MAAA,KAAW,SAAY,QAAA,GACrC,IAAA;AAGJ,IAAA,MAAM,cAAe,aAAA,CAA0C,OAAA;AAC/D,IAAA,MAAM,SAAS,CAAC,IAAA,KACb,cAAc,IAAI,CAAA,IAAK,cAAc,IAAI,CAAA;AAE5C,IAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,MAAA,MAAM,KAAA,GAAQ,OAAO,OAAO,CAAA;AAC5B,MAAA,SAAA,GAAY,OAAA;AACZ,MAAA,MAAA,GAAS,MAAA,CAAO,KAAA,EAAO,MAAA,IAAU,GAAG,CAAA;AAGpC,MAAA,MAAM,aAAa,KAAA,EAAO,YAAA;AAC1B,MAAA,MAAM,YAAY,UAAA,EAAY,IAAA;AAC9B,MAAA,IAAI,SAAA,EAAW;AAGb,QAAA,MAAM,WAAA,GAAe,UAAU,OAAA,IAAW,SAAA;AAC1C,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,WAAA,CAAY,CAAC,CAAA,KAAM,MAAS,CAAA;AAClF,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,gBAAA,GAAmB,SAAS,WAAA,EAAY;AACxC,UAAA,MAAM,SAAA,GAAY,YAAY,QAAQ,CAAA;AACtC,UAAA,IAAI,qBAAqB,QAAA,EAAU;AACjC,YAAA,kBAAA,GAAqB,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GACvC,SAAA,CAAwB,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA,GAC7C,IAAA;AAAA,UACN,CAAA,MAAO;AACL,YAAA,kBAAA,GAAqB,SAAA,IAAa,IAAA,GAAO,MAAA,CAAO,SAAS,CAAA,GAAI,IAAA;AAAA,UAC/D;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,cAAc,KAAA,EAAO,kBAAA;AAC3B,MAAA,iBAAA,GAAoB,aAAa,IAAA,IAAQ,IAAA,GAAO,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA,GAAI,IAAA;AAAA,IAC7E,CAAA,MAAA,IAAW,kBAAkB,QAAA,EAAU;AACrC,MAAA,MAAM,MAAA,GAAS,OAAO,QAAQ,CAAA;AAC9B,MAAA,SAAA,GAAY,QAAA;AACZ,MAAA,OAAA,GAAU,MAAA,CAAO,MAAA,EAAQ,EAAA,IAAM,GAAG,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,EAAA,IAAM,GAAG,CAAA;AAAA,IAChC,YAAA,EAAc,MAAA,CAAO,MAAA,CAAO,UAAA,IAAc,GAAG,CAAA;AAAA,IAC7C,cAAA;AAAA,IACA,YAAA,EAAcA,YAAA,CAAI,KAAA,CAAM,YAAA,CAAa,aAAuB,CAAA;AAAA,IAC5D,SAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,gBAAA;AAAA,IACA,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA,iBAAA;AAAA,IACA,cAAA,EAAgBA,YAAA,CAAI,KAAA,CAAM,MAAA,CAAO,eAAyB,CAAA;AAAA,IAC1D,gBAAA,EAAkB,IAAA;AAAA,IAClB,eAAA,EAAiB;AAAA,GACnB;AACF;AAGA,SAAS,YAAY,GAAA,EAA8B;AACjD,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,IAAA,EAAM,OAAO,IAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,GAAA;AACZ,EAAA,IAAI,MAAA,IAAU,GAAA,EAAK,OAAO,GAAA,CAAI,IAAA;AAC9B,EAAA,IAAI,MAAA,IAAU,KAAK,OAAO,IAAA;AAE1B,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,wBAAwB,GAAA,EAA6B;AAC5D,EAAA,MAAM,KAAA,GAAQ,YAAY,GAAG,CAAA;AAC7B,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,OAAO,gBAAgB,KAAK,CAAA;AAC9B;AAEA,SAAS,qBAAqB,GAAA,EAA6B;AACzD,EAAA,MAAM,KAAA,GAAQ,YAAY,GAAG,CAAA;AAC7B,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,GAAA,GAAMA,YAAA,CAAI,KAAA,CAAM,KAAe,CAAA;AACrC,EAAA,OAAO,GAAA,KAAQ,QAAQ,IAAA,GAAO,GAAA;AAChC;AAWA,SAAS,kBAAkB,GAAA,EAAsC;AAC/D,EAAA,MAAM,GAAA,GAAM,GAAA;AACZ,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,cAAA,EAA8B,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAC,CAAC,CAAA,IAAK,EAAC;AACzE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC,CAAA;AACnC,EAAA,OAAO,EAAE,aAAA,EAAe,GAAA,EAAK,KAAA,EAAM;AACrC;AAEA,SAAS,yBAAyB,GAAA,EAA0B;AAC1D,EAAA,MAAM,GAAA,GAAM,GAAA;AACZ,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,WAAA,IAAe,CAAC,CAAA;AAC9C,EAAA,MAAM,mBACJ,GAAA,CAAI,gBAAA,IAAoB,OAAO,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA,GAAI,IAAA;AAChE,EAAA,OAAO,eAAA,CAAgB,GAAA,CAAI,UAAA,EAAY,UAAA,EAAY,gBAAgB,CAAA;AACrE;AAIA,eAAsB,iBAAA,CACpB,QAAA,EACA,MAAA,EACA,KAAA,EACiC;AACjC,EAAA,OAAO,YAAY,YAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,eAAe,CAAC,MAAA,EAAQ,KAAK,CAAC,CAAA;AACjE,IAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,EACjC,CAAA,EAAG,SAAS,OAAO,CAAA;AACrB;AAEA,eAAsB,uBAAA,CACpB,QAAA,EACA,WAAA,EACA,MAAA,EACA,KAAA,EACiC;AACjC,EAAA,OAAO,YAAY,YAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,uBAAuB,CAAC,WAAA,EAAa,MAAA,EAAQ,KAAK,CAAC,CAAA;AACtF,IAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,EACjC,CAAA,EAAG,SAAS,OAAO,CAAA;AACrB;AAEA,eAAsB,0BAAA,CACpB,QAAA,EACA,OAAA,EACA,MAAA,EACA,KAAA,EACiC;AACjC,EAAA,OAAO,YAAY,YAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,0BAA0B,CAAC,OAAA,EAAS,MAAA,EAAQ,KAAK,CAAC,CAAA;AACrF,IAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,EACjC,CAAA,EAAG,SAAS,OAAO,CAAA;AACrB;AAQA,IAAM,YAAA,GAAuC;AAAA,EAC3C,SAAA,EAAW,CAAC,WAAA,EAAa,cAAA,EAAgB,SAAS,CAAA;AAAA,EAClD,YAAA,EAAc,CAAC,cAAc,CAAA;AAAA,EAC7B,OAAA,EAAS,CAAC,SAAS,CAAA;AAAA,EACnB,IAAA,EAAM,CAAC,MAAA,EAAQ,YAAY,CAAA;AAAA,EAC3B,UAAA,EAAY,CAAC,YAAY,CAAA;AAAA,EACzB,SAAA,EAAW,CAAC,WAAW;AACzB,CAAA;AAEA,eAAsB,wBAAA,CACpB,QAAA,EACA,KAAA,EACA,MAAA,EACA,KAAA,EACiC;AACjC,EAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,YAAY,YAAY;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,sBAAA,EAAwB,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG,MAAA,EAAQ,KAAK,CAAC,CAAA;AAChG,MAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,IACjC,CAAA,EAAG,SAAS,OAAO,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,YAAY,YAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,uBAAA,EAAyB,CAAC,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA,EAAG,MAAA,EAAQ,KAAK,CAAC,CAAA;AACtG,IAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,EACjC,CAAA,EAAG,SAAS,OAAO,CAAA;AACrB;AAIA,eAAsB,sBAAA,CACpB,UACA,YAAA,EAC4B;AAC5B,EAAA,OAAO,YAAY,YAAY;AAC7B,IAAA,MAAM,SAAS,MAAM,QAAA,CAAS,KAAK,mBAAA,EAAqB,CAAC,YAAY,CAAC,CAAA;AACtE,IAAA,MAAM,UAAA,GAAa,yBAAyB,MAAM,CAAA;AAElD,IAAA,IAAI,CAAC,UAAA,CAAW,WAAA,IAAe,UAAA,CAAW,WAAA,KAAgB,OAAO,OAAO,IAAA;AACxE,IAAA,OAAO,UAAA;AAAA,EACT,CAAA,EAAG,SAAS,OAAO,CAAA;AACrB;AAEA,eAAsB,sBAAA,CACpB,UACA,aAAA,EACuB;AACvB,EAAA,OAAO,YAAY,YAAY;AAC7B,IAAA,MAAM,SAAS,MAAM,QAAA,CAAS,KAAK,mBAAA,EAAqB,CAAC,aAAa,CAAC,CAAA;AACvE,IAAA,OAAQ,MAAA,CAAqB,IAAI,wBAAwB,CAAA;AAAA,EAC3D,CAAA,EAAG,SAAS,OAAO,CAAA;AACrB;AAIA,eAAsB,mBAAA,CACpB,QAAA,EACA,YAAA,EACA,MAAA,EACA,KAAA,EACwC;AACxC,EAAA,OAAO,YAAY,YAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,4BAA4B,CAAC,YAAA,EAAc,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC5F,IAAA,MAAM,GAAA,GAAM,MAAA;AACZ,IAAA,MAAM,OAAA,GAAW,GAAA,CAAI,OAAA,IAAyB,EAAC;AAC/C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC,CAAA;AACnC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAQ,GAAA,CAAI,CAAC,MAAM,iBAAA,CAAkB,CAAA,EAAG,YAAY,CAAC,CAAA;AAAA,MAC3D,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,SAAS,OAAO,CAAA;AACrB;AAEA,eAAsB,6BAAA,CACpB,QAAA,EACA,YAAA,EACA,QAAA,EACA,QACA,KAAA,EACwC;AACxC,EAAA,OAAO,YAAY,YAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,uCAAA,EAAyC,CAAC,YAAA,EAAc,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAC,CAAA;AACnH,IAAA,MAAM,GAAA,GAAM,MAAA;AACZ,IAAA,MAAM,OAAA,GAAW,GAAA,CAAI,OAAA,IAAyB,EAAC;AAC/C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC,CAAA;AACnC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAQ,GAAA,CAAI,CAAC,MAAM,iBAAA,CAAkB,CAAA,EAAG,YAAY,CAAC,CAAA;AAAA,MAC3D,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,SAAS,OAAO,CAAA;AACrB;AAIA,eAAsB,iBAAA,CACpB,QAAA,EACA,YAAA,EACA,MAAA,EACA,KAAA,EAC6B;AAC7B,EAAA,OAAO,YAAY,YAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,eAAe,CAAC,YAAA,EAAc,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC/E,IAAA,OAAQ,MAAA,CAAqB,IAAI,qBAAqB,CAAA;AAAA,EACxD,CAAA,EAAG,SAAS,OAAO,CAAA;AACrB;AAIA,eAAsB,YAAA,CACpB,UACA,YAAA,EACkB;AAClB,EAAA,OAAO,YAAY,YAAY;AAC7B,IAAA,MAAM,SAAS,MAAM,QAAA,CAAS,KAAK,mBAAA,EAAqB,CAAC,YAAY,CAAC,CAAA;AACtE,IAAA,OAAQ,MAAA,CAAqB,IAAI,UAAU,CAAA;AAAA,EAC7C,CAAA,EAAG,SAAS,OAAO,CAAA;AACrB;AAiDA,SAAS,YACP,OAAA,EACuB;AACvB,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,IAAA;AAAA,IACb,QAAA,EAAU,IAAA;AAAA,IACV,aAAA,EAAe,IAAA;AAAA,IACf,gBAAA,EAAkB,IAAA;AAAA,IAClB,eAAA,EAAiB,IAAA;AAAA,IACjB,GAAG;AAAA,GACL;AACF;AAGA,SAAS,UAAU,CAAA,EAAsB;AACvC,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAMA,YAAA,CAAI,KAAA,CAAM,CAAW,CAAC,IAAI,EAAC;AACpE;AAEA,SAAS,yBAAyB,UAAA,EAA4C;AAC5E,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,SAAA,CAAU,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAChF;AACA,EAAA,MAAM,EAAA,GAAK,UAAA;AACX,EAAA,MAAM,QACJ,OAAO,EAAA,CAAG,kBAAkB,UAAA,GAAa,EAAA,CAAG,eAAc,GAAI,IAAA;AAChE,EAAA,MAAM,WAAY,OAAO,EAAA,CAAG,aAAA,KAAkB,UAAA,GAAa,GAAG,OAAA,GAAU,EAAA;AAExE,EAAA,IAAI,KAAA,KAAU,OAAA,IAAW,QAAA,CAAS,KAAA,KAAU,MAAA,EAAW;AAErD,IAAA,MAAM,aAAa,QAAA,CAAS,KAAA;AAC5B,IAAA,MAAM,QAAS,OAAO,UAAA,EAAY,aAAA,KAAkB,UAAA,GAChD,WAAW,OAAA,GACX,UAAA;AAIJ,IAAA,IAAI,KAAA,EAAO,KAAA,KAAU,MAAA,IAAa,KAAA,EAAO,cAAc,MAAA,EAAW;AAChE,MAAA,MAAM,MAAM,KAAA,CAAM,SAAA;AAClB,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AACxC,MAAA,OAAO,WAAA,CAAY;AAAA,QACjB,SAAA,EAAW,iBAAA;AAAA,QACX,SAAS,MAAA,CAAO,GAAA,CAAI,QAAA,IAAY,CAAC,EAAE,QAAA,EAAS;AAAA,QAC5C,kBAAkB,OAAA,IAAW,IAAA,GAAOA,YAAA,CAAI,KAAA,CAAM,OAAiB,CAAA,GAAI,IAAA;AAAA,QACnE,eAAA,EAAiB,SAAA,CAAU,GAAA,CAAI,aAAa;AAAA,OAC7C,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,UAAA;AAC9B,IAAA,MAAM,aAAa,OAAO,KAAA,EAAO,kBAAkB,UAAA,GAAa,KAAA,CAAM,eAAc,GAAI,IAAA;AACxF,IAAA,MAAM,SAAU,OAAO,KAAA,EAAO,aAAA,KAAkB,UAAA,GAAa,MAAM,OAAA,GAAU,KAAA;AAE7E,IAAA,IAAI,UAAA,KAAe,QAAA,IAAY,MAAA,EAAQ,MAAA,KAAW,MAAA,EAAW;AAC3D,MAAA,OAAO,WAAA,CAAY;AAAA,QACjB,SAAA,EAAW,cAAA;AAAA,QACX,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,MAAM,EAAE,QAAA;AAAS,OACzC,CAAA;AAAA,IACH;AACA,IAAA,IAAI,UAAA,KAAe,aAAA,IAAiB,MAAA,EAAQ,WAAA,KAAgB,MAAA,EAAW;AACrE,MAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,MAAA,MAAM,OAAA,GAAU,WAAA,GAAc,GAAG,CAAA,IAAK,cAAc,CAAC,CAAA;AACrD,MAAA,MAAM,WAAA,GAAc,WAAA,GAAc,GAAG,CAAA,IAAK,cAAc,CAAC,CAAA;AACzD,MAAA,OAAO,WAAA,CAAY;AAAA,QACjB,SAAA,EAAW,mBAAA;AAAA,QACX,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA,CAAE,QAAA,EAAS;AAAA,QAClC,WAAA,EAAa,OAAO,WAAW;AAAA,OAChC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,KAAU,UAAA,IAAc,QAAA,CAAS,QAAA,KAAa,MAAA,EAAW;AAE3D,IAAA,MAAM,gBAAgB,QAAA,CAAS,QAAA;AAC/B,IAAA,MAAM,QAAS,OAAO,aAAA,EAAe,aAAA,KAAkB,UAAA,GACnD,cAAc,OAAA,GACd,aAAA;AAGJ,IAAA,IAAI,KAAA,EAAO,KAAA,KAAU,MAAA,IAAa,KAAA,EAAO,cAAc,MAAA,EAAW;AAChE,MAAA,MAAM,MAAM,KAAA,CAAM,SAAA;AAClB,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AACxC,MAAA,OAAO,WAAA,CAAY;AAAA,QACjB,SAAA,EAAW,qBAAA;AAAA,QACX,kBAAkB,OAAA,IAAW,IAAA,GAAOA,YAAA,CAAI,KAAA,CAAM,OAAiB,CAAA,GAAI,IAAA;AAAA,QACnE,eAAA,EAAiB,SAAA,CAAU,GAAA,CAAI,YAAY;AAAA,OAC5C,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,QAAA,GAAW,OAAO,KAAA,IAAS,aAAA;AACjC,IAAA,MAAM,aACJ,OAAO,QAAA,EAAU,kBAAkB,UAAA,GAAa,QAAA,CAAS,eAAc,GAAI,IAAA;AAC7E,IAAA,MAAM,SAAU,OAAO,QAAA,EAAU,aAAA,KAAkB,UAAA,GAAa,SAAS,OAAA,GAAU,QAAA;AAEnF,IAAA,IAAI,UAAA,KAAe,UAAA,IAAc,MAAA,EAAQ,QAAA,KAAa,MAAA,EAAW;AAC/D,MAAA,OAAO,WAAA,CAAY;AAAA,QACjB,SAAA,EAAW,oBAAA;AAAA,QACX,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,QAAQ;AAAA,OACjC,CAAA;AAAA,IACH;AACA,IAAA,IAAI,UAAA,KAAe,mBAAA,IAAuB,MAAA,EAAQ,iBAAA,KAAsB,MAAA,EAAW;AACjF,MAAA,OAAO,WAAA,CAAY,EAAE,SAAA,EAAW,8BAAA,EAAgC,CAAA;AAAA,IAClE;AACA,IAAA,IAAI,UAAA,KAAe,aAAA,IAAiB,MAAA,EAAQ,WAAA,KAAgB,MAAA,EAAW;AACrE,MAAA,OAAO,WAAA,CAAY,EAAE,SAAA,EAAW,wBAAA,EAA0B,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,UAAA,KAAe,aAAA,IAAiB,MAAA,EAAQ,WAAA,KAAgB,MAAA,EAAW;AACrE,MAAA,OAAO,WAAA,CAAY,EAAE,SAAA,EAAW,wBAAA,EAA0B,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,UAAA,KAAe,QAAA,IAAY,MAAA,EAAQ,MAAA,KAAW,MAAA,EAAW;AAC3D,MAAA,OAAO,WAAA,CAAY;AAAA,QACjB,SAAA,EAAW,kBAAA;AAAA,QACX,aAAA,EAAe,KAAK,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA;AAAA,OACvD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,0CAAA,EAA6C,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA,GACzE;AACF;AAEA,eAAsB,kBAAA,CACpB,QAAA,EACA,YAAA,EACA,MAAA,EACA,KAAA,EACkC;AAClC,EAAA,OAAO,YAAY,YAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,4BAA4B,CAAC,YAAA,EAAc,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC5F,IAAA,MAAM,GAAA,GAAM,MAAA;AACZ,IAAA,MAAM,MAAA,GAAA,CAAgC,GAAA,CAAI,MAAA,IAAwB,EAAC,EAAG,GAAA;AAAA,MACpE,CAAC,GAAA,KAAQ;AACP,QAAA,MAAM,KAAA,GAAQ,GAAA;AACd,QAAA,OAAO;AAAA,UACL,GAAG,wBAAA,CAAyB,KAAA,CAAM,WAAW,CAAA;AAAA,UAC7C,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,OAAO;AAAA,SAChC;AAAA,MACF;AAAA,KACF;AACA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC,CAAA;AAAA,MAC5B,YAAA,EAAc,MAAA,CAAO,GAAA,CAAI,aAAA,IAAiB,CAAC,CAAA;AAAA,MAC3C,cAAA,EAAgB,MAAA,CAAO,GAAA,CAAI,eAAA,IAAmB,CAAC;AAAA,KACjD;AAAA,EACF,CAAA,EAAG,SAAS,OAAO,CAAA;AACrB;;;ACn0BA,IAAA,qBAAA,GAAA;AAAA,EACE;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,iBAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,iDAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,gBAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,mBAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,oDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,oCAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,6BAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,uCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,uCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,0BAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,wBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,qBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,YAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,qDAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,2EAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,yCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,yCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,wDAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,uCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,0BAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,oCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,4DAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,2CAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,mEAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,qEAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,iEAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,wBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,yFAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,gDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,mBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,yCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,IAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,mBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,iDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,wDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,gDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,kDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,gFAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,4CAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,8CAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,+CAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,IAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,kDAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,sDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,0DAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,0CAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,gDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,IAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,iBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,8CAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,uCAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,kDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,yCAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,iDAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,mBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,qDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,4CAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,yCAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,6CAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,+CAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,iBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,4CAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,aAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,qBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,cAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,wBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,sBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,uBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,mBAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,2BAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,cAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,8BAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,4BAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,6BAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,mBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,mBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,gBAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,0BAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,mCAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,uCAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,aAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,mBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,0BAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,gBAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,aAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,oDAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,OAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,sBAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,6DAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,mBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,mBAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,aAAA;AAAA,IACR,IAAA,EAAQ,aAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,iBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,+EAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,mFAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,gEAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,sBAAA;AAAA,QACR,IAAA,EAAQ,+EAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,0BAAA;AAAA,QACR,IAAA,EAAQ,mFAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,oEAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ,uCAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,iEAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,oEAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,sDAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ,gEAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAQ,iEAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF;AAEJ,CAAA;;;AC31CA,IAAA,eAAA,GAAA;AAAA,EACE;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,iBAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,iDAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,gBAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,yBAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,iDAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,wBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,gBAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,iBAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,YAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,iEAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,aAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,wBAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,6BAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,4CAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,4DAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,iFAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,mEAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,IAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,wEAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,iBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,aAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,uCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,uCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,0BAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,wBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,qBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,qDAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,2EAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,yCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,yCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,wDAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,uCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,0BAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,oCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,4DAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,2CAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,mEAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,qEAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,iEAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,wBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,yFAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,gDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,mBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,yCAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,IAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,mBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,oCAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,uCAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,qBAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,iEAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,mEAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,2FAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,4DAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,wDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,8CAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,kDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,yCAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,iDAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,mBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,qDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,4CAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,yCAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,gFAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,8CAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,+CAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,IAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,kDAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,sDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,0DAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,0CAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,uCAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,mBAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,YAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,eAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,gCAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,mBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,yBAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,aAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,mBAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,oBAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,MAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,gBAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,kBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,aAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,gBAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,sBAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,MAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,gBAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,iCAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,aAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,MAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,gBAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,cAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,cAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,aAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,cAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,uDAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,iBAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,uBAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,UAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,+CAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,cAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,aAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,oDAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,OAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,cAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,4CAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,wDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,6EAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,uDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,mBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,+EAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,kDAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,eAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,sBAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,qEAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,qBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,kEAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,uBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,2BAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,WAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,gDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,IAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,iBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,2CAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,kBAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,kBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,kBAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,wDAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,yDAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,cAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,iBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,iBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ,iBAAA;AAAA,IACR,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,oEAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,IAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,0EAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,uDAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,yBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,uBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,6BAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,cAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,wBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,YAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,eAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,aAAA;AAAA,IACR,IAAA,EAAQ,aAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,uBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,kGAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,UAAY;AAAC,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,2GAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,UAAY;AAAC,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,wDAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,UAAY;AAAC,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,2FAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,UAAY;AAAC,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,+EAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,mFAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,gEAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,sBAAA;AAAA,QACR,IAAA,EAAQ,+EAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,0BAAA;AAAA,QACR,IAAA,EAAQ,mFAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,oEAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ,uCAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,iEAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,oEAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,8FAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,UAAY;AAAC,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,oFAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,UAAY;AAAC,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,4GAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,UAAY;AAAC,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,yEAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,UAAY;AAAC,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,yEAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,UAAY;AAAC,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,oCAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,uCAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ,qDAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,2EAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ,mEAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,mBAAA;AAAA,QACR,IAAA,EAAQ,yFAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,yCAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,8CAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,6BAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,iBAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ,0CAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,iBAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,gCAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ,yCAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,8CAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,qBAAA;AAAA,QACR,IAAA,EAAQ,mEAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,kCAAA;AAAA,IACR,IAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ,kGAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ,2GAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ,wDAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAQ,2FAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ,gEAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAQ,iEAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,mBAAA;AAAA,QACR,IAAA,EAAQ,8FAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ,oFAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,uBAAA;AAAA,QACR,IAAA,EAAQ,4GAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ,yEAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,sBAAA;AAAA,QACR,IAAA,EAAQ,yEAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,mBAAA;AAAA,QACR,IAAA,EAAQ,oCAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,wBAAA;AAAA,QACR,IAAA,EAAQ,yCAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,6BAAA;AAAA,QACR,IAAA,EAAQ,8CAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ,6BAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ,gCAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,6BAAA;AAAA,QACR,IAAA,EAAQ,8CAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,uBAAA;AAAA,QACR,IAAA,EAAQ,wCAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,6BAAA;AAAA,QACR,IAAA,EAAQ,8CAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ,qDAAA;AAAA,IACR,KAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,sBAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,KAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,4BAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,SAAW,EAAC;AAAA,QACZ,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,kBAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,wBAAA;AAAA,QACR,QAAU,EAAC;AAAA,QACX,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA,OACtB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,6BAAA;AAAA,QACR,MAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAQ,eAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,OAAA,EAAW;AAAA,UACT;AAAA,YACE,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,gBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,wCAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,8CAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ,mDAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV;AACF;AAEJ,CAAA;;;ACjyEA,SAASE,YAAAA,CAAe,IAAsB,eAAA,EAAsC;AAClF,EAAA,OAAO,EAAA,EAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AACpC,IAAA,MAAM,IAAI,QAAA;AAAA,MACR,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,iBAAA;AAAA,MACzC;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAkBA,eAAsB,mCAAA,CACpB,UACA,YAAA,EACmB;AACnB,EAAA,OAAOA,aAAY,YAAY;AAC7B,IAAA,MAAM,SAAS,MAAM,QAAA,CAAS,KAAK,gCAAA,EAAkC,CAAC,YAAY,CAAC,CAAA;AACnF,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAK,SAAuB,EAAC;AAC7D,IAAA,OAAO,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACjC,CAAA,EAAG,SAAS,OAAO,CAAA;AACrB;;;ACkDO,IAAM,gBAAN,MAAoB;AAAA,EACR,cAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACT,cAAA,GAAqC,IAAA;AAAA,EACrC,oBAAA,GAAwC,IAAA;AAAA,EACxC,qBAAA,GAAyC,IAAA;AAAA,EAEjD,YAAY,MAAA,EAA6B;AAEvC,IAAA,MAAM,cAAc,MAAA,CAAO,KAAA,GAAQ,cAAA,CAAe,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA;AAClE,IAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,MACpB,GAAG,MAAA;AAAA,MACH,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,WAAA,EAAa,UAAA,IAAc,EAAA;AAAA,MAC5D,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,WAAA,EAAa,MAAA,IAAU,EAAA;AAAA,MAChD,aAAA,EAAe,MAAA,CAAO,aAAA,IAAiB,WAAA,EAAa,aAAA,IAAiB,EAAA;AAAA,MACrE,cAAA,EAAgB,MAAA,CAAO,cAAA,IAAkB,WAAA,EAAa,cAAA,IAAkB;AAAA,KAC1E;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,WAAA,EAAa,SACtC,IAAA,CAAK,cAAA,CAAe,UAAA,CAAW,OAAA,CAAQ,SAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,KAAA;AAChF,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,KAAK,CAAA;AAEpC,IAAA,IAAA,CAAK,mBAAmB,IAAI,gBAAA;AAAA,MAC1B,KAAK,cAAA,CAAe,UAAA;AAAA,MACpB,KAAK,cAAA,CAAe,MAAA;AAAA,MACpB,MAAA,CAAO;AAAA,KACT;AAGA,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,UAAA,IAAc,IAAA,CAAK,eAAe,MAAA,EAAQ;AAChE,MAAA,IAAA,CAAK,iBAAiB,eAAA,EAAgB;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,IAAI,YAAA,GAAoC;AACtC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,cAAA,EAAe;AAAA,EAClC;AAAA;AAAA,EAGA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,KAAK,SAAA,CAAU,WAAA;AAAA,EACxB;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA6C;AAC3C,IAAA,OAAO,IAAA,CAAK,iBAAiB,SAAA,EAAU;AAAA,EACzC;AAAA;AAAA,EAGA,yBAAyB,QAAA,EAA+D;AACtF,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,SAAA,CAAU,QAAQ,CAAA;AAAA,EACjD;AAAA;AAAA,EAIA,MAAc,WAAA,GAAoC;AAChD,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,OAAO,IAAA,CAAK,cAAA;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ;AAC/B,MAAA,MAAM,IAAI,SAAS,sBAAsB,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,IAAA,CAAK,eAAe,QAAA,EAAU;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,cAAA,CAAe,QAAA;AAC1C,MAAA,OAAO,IAAA,CAAK,cAAA;AAAA,IACd;AACA,IAAA,IAAA,CAAK,iBAAiB,MAAM,cAAA;AAAA,MAC1B,KAAK,cAAA,CAAe,MAAA;AAAA,MACpB,KAAK,cAAA,CAAe;AAAA,KACtB;AACA,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,MAAc,iBAAA,GAAuC;AACnD,IAAA,IAAI,IAAA,CAAK,oBAAA,EAAsB,OAAO,IAAA,CAAK,oBAAA;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,aAAA,EAAe;AACtC,MAAA,MAAM,IAAI,SAAS,iHAAiH,CAAA;AAAA,IACtI;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,IAAA,CAAK,uBAAuB,MAAM,cAAA;AAAA,MAChC,qBAAA;AAAA,MACA,KAAK,cAAA,CAAe,aAAA;AAAA,MACpB;AAAA,KACF;AACA,IAAA,OAAO,IAAA,CAAK,oBAAA;AAAA,EACd;AAAA,EAEA,MAAc,kBAAA,GAAwC;AACpD,IAAA,IAAI,IAAA,CAAK,qBAAA,EAAuB,OAAO,IAAA,CAAK,qBAAA;AAC5C,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,cAAA,EAAgB;AACvC,MAAA,MAAM,IAAI,SAAS,oHAAoH,CAAA;AAAA,IACzI;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,IAAA,CAAK,wBAAwB,MAAM,cAAA;AAAA,MACjC,eAAA;AAAA,MACA,KAAK,cAAA,CAAe,cAAA;AAAA,MACpB;AAAA,KACF;AACA,IAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,EACd;AAAA;AAAA,EAIA,IAAY,MAAA,GAAS;AACnB,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,KAAK,cAAA,CAAe,aAAA;AAAA,MACnC,UAAA,EAAY,KAAK,cAAA,CAAe,UAAA;AAAA,MAChC,OAAA,EAAS,KAAK,cAAA,CAAe;AAAA,KAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAe,MAAA,EAAqE;AACxF,IAAA,MAAM,cAAc,YAAkD;AACpE,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAC9C,MAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,CAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAG/B,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,YAAA,GAAe,MAAM,wBAAA,CAAyB,QAAA,EAAU,MAAA,CAAO,KAAA,EAAO,QAAQ,KAAK,CAAA;AAAA,MACrF,CAAA,MAAA,IAAW,QAAQ,WAAA,EAAa;AAC9B,QAAA,YAAA,GAAe,MAAM,uBAAA,CAAwB,QAAA,EAAU,MAAA,CAAO,WAAA,EAAa,QAAQ,KAAK,CAAA;AAAA,MAC1F,CAAA,MAAA,IAAW,QAAQ,OAAA,EAAS;AAC1B,QAAA,YAAA,GAAe,MAAM,0BAAA,CAA2B,QAAA,EAAU,MAAA,CAAO,OAAA,EAAS,QAAQ,KAAK,CAAA;AAAA,MACzF,CAAA,MAAO;AACL,QAAA,YAAA,GAAe,MAAM,iBAAA,CAAkB,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAA;AAAA,MAChE;AAGA,MAAA,IAAI,OAAqB,EAAC;AAC1B,MAAA,IAAI,YAAA,CAAa,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACzC,QAAA,IAAA,GAAO,MAAM,sBAAA,CAAuB,QAAA,EAAU,YAAA,CAAa,aAAa,CAAA;AAGxE,QAAA,IAAI,QAAQ,mBAAA,EAAqB;AAC/B,UAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA;AAAA,YAAI,CAAC,CAAA,KAC9B,YAAA,CAAa,QAAA,EAAU,CAAA,CAAE,EAAE,CAAA,CAAE,KAAA,CAAM,MAAM,EAAa;AAAA,WACxD;AACA,UAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACjD,UAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,YAAA,MAAM,MAAA,GAAS,UAAU,CAAC,CAAA;AAC1B,YAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAEhC,YAAA,MAAM,QAAA,uBAAe,GAAA,EAAgG;AACrH,YAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AAEtB,cAAA,IAAI,CAAA,CAAE,SAAA,KAAc,WAAA,IAAe,CAAA,CAAE,gBAAgB,IAAA,EAAM;AAC3D,cAAA,MAAM,MAAM,CAAA,CAAE,YAAA;AACd,cAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACjC,cAAA,IAAI,QAAA,EAAU;AACZ,gBAAA,QAAA,CAAS,WAAA,IAAe,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,GAAG,CAAA;AAC9C,gBAAA,IAAI,CAAA,CAAE,SAAA,KAAc,QAAA,EAAU,QAAA,CAAS,QAAA,IAAY,CAAA;AAAA,cACrD,CAAA,MAAO;AACL,gBAAA,QAAA,CAAS,IAAI,GAAA,EAAK;AAAA,kBAChB,cAAc,CAAA,CAAE,YAAA;AAAA,kBAChB,WAAW,CAAA,CAAE,SAAA;AAAA,kBACb,WAAA,EAAa,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,GAAG,CAAA;AAAA,kBACnC,QAAA,EAAU,CAAA,CAAE,SAAA,KAAc,QAAA,GAAW,CAAA,GAAI;AAAA,iBAC1C,CAAA;AAAA,cACH;AAAA,YACF;AACA,YAAA,OAAO;AAAA,cACL,GAAG,CAAA;AAAA,cACH,gBAAA,EAAkB,MAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,gBAC1D,cAAc,CAAA,CAAE,YAAA;AAAA,gBAChB,WAAW,CAAA,CAAE,SAAA;AAAA,gBACb,WAAA,EAAa,CAAA,CAAE,WAAA,CAAY,QAAA,EAAS;AAAA,gBACpC,UAAU,CAAA,CAAE;AAAA,eACd,CAAE;AAAA,aACJ;AAAA,UACF,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,YAAA,CAAa,KAAA,EAAO,OAAO,MAAA,EAAO;AAAA,IAC1D,CAAA;AAEA,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,aAAA,KAAkB,KAAA,EAAO;AAC/C,MAAA,OAAO,WAAA,EAAY;AAAA,IACrB;AAEA,IAAA,OAAO,YAAA;AAAA,MACL,MAAM,cAAA,CAAkB,IAAA,CAAK,eAAe,UAAA,EAAY,MAAA,EAAQ,KAAK,MAAM,CAAA;AAAA,MAC3E,WAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,cAAc,YAAA,EAAkD;AACpE,IAAA,MAAM,cAAc,YAAY;AAC9B,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAC9C,MAAA,MAAM,UAAA,GAAa,MAAM,sBAAA,CAAuB,QAAA,EAAU,YAAY,CAAA;AACtE,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,IAAA,CAAK,wBAAwB,UAAU,CAAA;AAAA,MAC/C;AACA,MAAA,OAAO,UAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,aAAA,KAAkB,KAAA,EAAO;AAC/C,MAAA,OAAO,WAAA,EAAY;AAAA,IACrB;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,aAAA,CAAiB,IAAA,CAAK,eAAe,UAAA,EAAY,YAAA,EAAc,KAAK,MAAM,CAAA;AAAA,IACzF,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,iBAAiB,kBAAA,EAAmB;AACzC,QAAA,OAAO,MAAM,WAAA,EAAY;AAAA,MAC3B,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAc,wBAAwB,UAAA,EAAuC;AAC3E,IAAA,MAAM,IAAA,GAAO,WAAW,QAAA,EAAU,YAAA;AAClC,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AAEvC,IAAA,MAAM,GAAA,GACF,KAA+C,OAAA,IAC9C,IAAA;AACL,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,MAAA;AACtC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,IAAK,WAAA,CAAY,SAAS,CAAA,EAAG;AAE3D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,+BAAA,CAAgC,WAAW,EAAE,CAAA;AACvE,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAErB,QAAC,IAAgC,MAAA,GAAS,MAAA;AAAA,MAC5C;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,gCAAgC,YAAA,EAAyC;AAC7E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,kBAAA,EAAmB;AAC/C,IAAA,OAAO,mCAAA,CAAoC,UAAU,YAAY,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,yBAAyB,YAAA,EAAmD;AAChF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAE9C,IAAA,OAAO,iBAAA,CAAkB,QAAA,EAAU,YAAA,EAAc,CAAA,EAAG,GAAI,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,0BAAA,CACJ,YAAA,EACA,MAAA,EACwC;AACxC,IAAA,MAAM,cAAc,YAAY;AAC9B,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAC9C,MAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,CAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,MAAA,IAAI,MAAA,EAAQ,cAAc,MAAA,EAAQ;AAChC,QAAA,OAAO,8BAA8B,QAAA,EAAU,YAAA,EAAc,MAAA,CAAO,YAAA,EAAc,QAAQ,KAAK,CAAA;AAAA,MACjG;AACA,MAAA,OAAO,mBAAA,CAAoB,QAAA,EAAU,YAAA,EAAc,MAAA,EAAQ,KAAK,CAAA;AAAA,IAClE,CAAA;AAEA,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,aAAA,KAAkB,KAAA,EAAO;AAC/C,MAAA,OAAO,WAAA,EAAY;AAAA,IACrB;AAEA,IAAA,OAAO,YAAA;AAAA,MACL,MAAM,2BAA8B,IAAA,CAAK,cAAA,CAAe,YAAY,YAAA,EAAc,MAAA,EAAQ,KAAK,MAAM,CAAA;AAAA,MACrG,WAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,YAAA,EAAwC;AAChE,IAAA,MAAM,cAAc,YAAY;AAC9B,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAC9C,MAAA,OAAO,YAAA,CAAa,UAAU,YAAY,CAAA;AAAA,IAC5C,CAAA;AAEA,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,aAAA,KAAkB,KAAA,EAAO;AAC/C,MAAA,OAAO,WAAA,EAAY;AAAA,IACrB;AAEA,IAAA,OAAO,YAAA;AAAA,MACL,MAAM,mBAAA,CAAuB,IAAA,CAAK,eAAe,UAAA,EAAY,YAAA,EAAc,KAAK,MAAM,CAAA;AAAA,MACtF,WAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,kBAAA,CACJ,WAAA,EACA,MAAA,EACsC;AACtC,IAAA,MAAM,cAAc,YAAkD;AACpE,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAC9C,MAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,CAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,MAAA,MAAM,eAAe,MAAM,uBAAA,CAAwB,QAAA,EAAU,WAAA,EAAa,QAAQ,KAAK,CAAA;AAEvF,MAAA,IAAI,OAAqB,EAAC;AAC1B,MAAA,IAAI,YAAA,CAAa,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACzC,QAAA,IAAA,GAAO,MAAM,sBAAA,CAAuB,QAAA,EAAU,YAAA,CAAa,aAAa,CAAA;AAAA,MAC1E;AAEA,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,YAAA,CAAa,KAAA,EAAO,OAAO,MAAA,EAAO;AAAA,IAC1D,CAAA;AAEA,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,aAAA,KAAkB,KAAA,EAAO;AAC/C,MAAA,OAAO,WAAA,EAAY;AAAA,IACrB;AAEA,IAAA,OAAO,YAAA;AAAA,MACL,MAAM,mBAAsB,IAAA,CAAK,cAAA,CAAe,YAAY,WAAA,EAAa,MAAA,EAAQ,KAAK,MAAM,CAAA;AAAA,MAC5F,WAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,WAAA,EAA6C;AAC9D,IAAA,OAAO,aAAgB,IAAA,CAAK,cAAA,CAAe,UAAA,EAAY,WAAA,EAAa,KAAK,MAAM,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,yBAAA,CACJ,YAAA,EACA,MAAA,EACuC;AACvC,IAAA,MAAM,cAAc,YAAmD;AACrE,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAC9C,MAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,CAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,GAAA;AAC/B,MAAA,MAAM,SAAS,MAAM,kBAAA,CAAmB,QAAA,EAAU,YAAA,EAAc,QAAQ,KAAK,CAAA;AAC7E,MAAA,MAAM,IAAA,GAAsB,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACpD,YAAA;AAAA,QACA,GAAG;AAAA,OACL,CAAE,CAAA;AACF,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,OAAO,MAAA,EAAO;AAAA,IACpD,CAAA;AAEA,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,aAAA,KAAkB,KAAA,EAAO;AAC/C,MAAA,OAAO,WAAA,EAAY;AAAA,IACrB;AAEA,IAAA,OAAO,YAAA;AAAA,MACL,MAAM,0BAA6B,IAAA,CAAK,cAAA,CAAe,YAAY,YAAA,EAAc,MAAA,EAAQ,KAAK,MAAM,CAAA;AAAA,MACpG,WAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iCAAiC,YAAA,EAAmD;AACxF,IAAA,MAAM,cAAc,YAAyC;AAC3D,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAC9C,MAAA,MAAM,SAAS,MAAM,kBAAA,CAAmB,QAAA,EAAU,YAAA,EAAc,GAAG,CAAC,CAAA;AACpE,MAAA,OAAO;AAAA,QACL,aAAa,MAAA,CAAO,KAAA;AAAA,QACpB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,gBAAgB,MAAA,CAAO;AAAA,OACzB;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,aAAA,KAAkB,KAAA,EAAO;AAC/C,MAAA,OAAO,WAAA,EAAY;AAAA,IACrB;AAEA,IAAA,OAAO,YAAA;AAAA,MACL,MAAM,gCAAA,CAAoC,IAAA,CAAK,eAAe,UAAA,EAAY,YAAA,EAAc,KAAK,MAAM,CAAA;AAAA,MACnG,WAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,2BAAA,CACJ,YAAA,EACA,MAAA,EAC8C;AAC9C,IAAA,OAAO,4BAA+B,IAAA,CAAK,cAAA,CAAe,YAAY,YAAA,EAAc,MAAA,EAAQ,KAAK,MAAM,CAAA;AAAA,EACzG;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,8BAA8B,YAAA,EAAmD;AACrF,IAAA,OAAO,8BAAiC,IAAA,CAAK,cAAA,CAAe,UAAA,EAAY,YAAA,EAAc,KAAK,MAAM,CAAA;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBAAA,GAA2C;AAC/C,IAAA,OAAO,gBAAA,CAAoB,IAAA,CAAK,cAAA,CAAe,UAAA,EAAY,KAAK,MAAM,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,GAAqC;AACzC,IAAA,OAAO,aAAA,CAAiB,IAAA,CAAK,cAAA,CAAe,UAAA,EAAY,KAAK,MAAM,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,UAAU,OAAA,EAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,UAAU,UAAA,EAAW;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,iBAAiB,OAAA,EAAQ;AAC9B,IAAA,IAAA,CAAK,UAAU,UAAA,EAAW;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,CACE,QAAA,EACA,OAAA,EACA,aAAA,EACY;AACZ,IAAA,OAAO,KAAK,SAAA,CAAU,SAAA,CAAU,EAAE,QAAA,EAAU,aAAA,IAAiB,OAAO,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,QAAA,EAAoD;AACvE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,QAAQ,CAAA;AAAA,EACnD;AACF;AAKO,SAAS,oBAAoB,MAAA,EAA4C;AAC9E,EAAA,OAAO,IAAI,cAAc,MAAM,CAAA;AACjC;;;ACpmBA,SAAS,iBAAiB,KAAA,EAAiC;AACzD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,CAAA;AACrD;AAEA,SAAS,2BAA2B,KAAA,EAAiC;AACnE,EAAA,IAAI,CAAC,iBAAiB,KAAK,CAAA,IAAK,MAAM,IAAA,EAAK,KAAM,OAAO,OAAO,KAAA;AAC/D,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,OAAO,KAAA;AAEjC,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,KAAK,CAAA,IAAK,EAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,2BAA2B,KAAA,EAAiC;AACnE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,SAAA,CAAU,KAAK,KAAK,KAAA,IAAS,CAAA;AAC1E;AAEA,SAAS,wBAAwB,KAAA,EAAiC;AAChE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,SAAA,CAAU,KAAK,KAAK,KAAA,GAAQ,CAAA;AACzE;AAEA,SAAS,mBAAmB,KAAA,EAAiC;AAC3D,EAAA,OACE,UAAU,QAAA,IACV,KAAA,KAAU,aAAA,IACV,KAAA,KAAU,aACV,KAAA,KAAU,QAAA;AAEd;AAEA,SAAS,wBAAwB,KAAA,EAAuB;AACtD,EAAA,OACE,KAAA,CAAM,gBAAA,KAAqB,IAAA,IAC3B,KAAA,CAAM,kBAAA,KAAuB,QAC7B,KAAA,CAAM,kBAAA,KAAuB,IAAA,IAC7B,KAAA,CAAM,iBAAA,KAAsB,IAAA;AAEhC;AAEA,SAAS,2BAA2B,KAAA,EAAuB;AACzD,EAAA,IAAI,KAAA,CAAM,gBAAA,KAAqB,IAAA,EAAM,OAAO,wBAAwB,KAAK,CAAA;AACzE,EAAA,IAAI,CAAC,kBAAA,CAAmB,KAAA,CAAM,gBAAgB,GAAG,OAAO,KAAA;AACxD,EAAA,IAAI,CAAC,uBAAA,CAAwB,KAAA,CAAM,iBAAiB,GAAG,OAAO,KAAA;AAE9D,EAAA,IAAI,KAAA,CAAM,qBAAqB,QAAA,EAAU;AACvC,IAAA,OACE,KAAA,CAAM,kBAAA,KAAuB,IAAA,IAC7B,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,kBAAkB,CAAA,IACtC,KAAA,CAAM,kBAAA,CAAmB,MAAA,KAAW,KAAA,CAAM,iBAAA,IAC1C,KAAA,CAAM,kBAAA,CAAmB,KAAA,CAAM,0BAA0B,CAAA,IACzD,KAAA,CAAM,kBAAA,CAAmB,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,GAAM,KAAA,EAAO,CAAC,CAAA,KAAM,GAAA;AAAA,EAExE;AAEA,EAAA,IAAI,KAAA,CAAM,qBAAqB,SAAA,EAAW;AACxC,IAAA,OAAO,KAAA,CAAM,kBAAA,KAAuB,IAAA,IAAQ,KAAA,CAAM,kBAAA,KAAuB,IAAA;AAAA,EAC3E;AAEA,EAAA,OACE,0BAAA,CAA2B,KAAA,CAAM,kBAAkB,CAAA,IACnD,MAAM,kBAAA,KAAuB,IAAA;AAEjC;AAEA,SAAS,mBAAmB,KAAA,EAAuB;AACjD,EAAA,OACE,2BAA2B,KAAA,CAAM,OAAO,KACxC,0BAAA,CAA2B,KAAA,CAAM,YAAY,CAAA,IAC7C,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,cAAc,CAAA,IACrC,KAAA,CAAM,kBAAkB,CAAA,IACxB,gBAAA,CAAiB,MAAM,cAAc,CAAA;AAEzC;AAEA,SAAS,mBAAmB,KAAA,EAAyB;AACnD,EAAA,OACE,KAAA,KAAU,IAAA,IACT,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,CAAC,KAAA,KAAU,OAAO,KAAA,KAAU,QAAQ,CAAA;AAE7E;AAEA,SAAS,cAAc,KAAA,EAAsB;AAC3C,EAAA,MAAM,UAAU,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA,GAAI,MAAM,OAAA,GAAU,WAAA;AAClE,EAAA,OAAO,CAAA,QAAA,EAAW,OAAO,CAAA,YAAA,EAAe,KAAA,CAAM,SAAS,CAAA,CAAA;AACzD;AAEA,SAAS,wBAAA,CACP,QACA,KAAA,EACW;AACX,EAAA,OAAO,IAAI,SAAA;AAAA,IACT,CAAA,OAAA,EAAU,MAAM,CAAA,gCAAA,EAAmC,aAAA,CAAc,KAAK,CAAC,CAAA,CAAA;AAAA,GACzE;AACF;AAEA,SAAS,4BAAA,CACP,QACA,KAAA,EACW;AACX,EAAA,OAAO,IAAI,SAAA;AAAA,IACT,CAAA,OAAA,EAAU,MAAM,CAAA,oCAAA,EACd,aAAA,CAAc,KAAK,CACrB,CAAA,CAAA;AAAA,GACF;AACF;AAEA,SAAS,4BAA4B,KAAA,EAAyB;AAC5D,EAAA,IAAI,OAAO,SAAA,CAAU,KAAA,CAAM,cAAc,CAAA,IAAK,KAAA,CAAM,iBAAiB,CAAA,EAAG;AACtE,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,mBAAmB,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,+DAAA,EACE,aAAA,CAAc,KAAK,CACrB,CAAA,CAAA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,SAAA;AAAA,IACR,CAAA,kEAAA,EACE,aAAA,CAAc,KAAK,CACrB,CAAA,CAAA;AAAA,GACF;AACF;AAEA,SAAS,gCAAgC,KAAA,EAA6B;AACpE,EAAA,IAAI,OAAO,SAAA,CAAU,KAAA,CAAM,cAAc,CAAA,IAAK,KAAA,CAAM,iBAAiB,CAAA,EAAG;AACtE,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,mBAAmB,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,mEAAA,EACE,aAAA,CAAc,KAAK,CACrB,CAAA,CAAA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,SAAA;AAAA,IACR,CAAA,sEAAA,EACE,aAAA,CAAc,KAAK,CACrB,CAAA,CAAA;AAAA,GACF;AACF;AAEA,SAAS,0BAA0B,KAAA,EAAuB;AACxD,EAAA,OAAO,MAAM,cAAA,GAAiB,CAAA;AAChC;AAEO,SAAS,gBAAgB,KAAA,EAAmC;AACjE,EAAA,IACE,CAAC,mBAAmB,KAAK,CAAA,IACzB,CAAC,gBAAA,CAAiB,KAAA,CAAM,YAAY,CAAA,EACpC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAM,SAAA,KAAc,OAAA,GACvB,0BAAA,CAA2B,KAAA,CAAM,MAAM,CAAA,IACrC,KAAA,CAAM,OAAA,KAAY,IAAA,IAClB,MAAM,gBAAA,KAAqB,IAAA,IAC3B,KAAA,CAAM,eAAA,KAAoB,QAC1B,0BAAA,CAA2B,KAAK,CAAA,GAClC,KAAA,CAAM,cAAc,QAAA,IAClB,KAAA,CAAM,MAAA,KAAW,IAAA,IACjB,2BAA2B,KAAA,CAAM,OAAO,CAAA,IACxC,KAAA,CAAM,qBAAqB,IAAA,IAC3B,KAAA,CAAM,eAAA,KAAoB,IAAA,IAC1B,wBAAwB,KAAK,CAAA;AACrC;AAEO,SAAS,oBAAoB,KAAA,EAAuC;AACzE,EAAA,OACE,kBAAA,CAAmB,KAAK,CAAA,IACxB,KAAA,CAAM,SAAA,KAAc,eACpB,KAAA,CAAM,YAAA,KAAiB,IAAA,IACvB,KAAA,CAAM,MAAA,KAAW,IAAA,IACjB,MAAM,OAAA,KAAY,IAAA,IAClB,uBAAA,CAAwB,KAAK,CAAA,IAC7B,gBAAA,CAAiB,MAAM,gBAAgB,CAAA,IACvC,kBAAA,CAAmB,KAAA,CAAM,eAAe,CAAA;AAE5C;AAEO,SAAS,aAAa,KAAA,EAAmC;AAC9D,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,IAAK,yBAAA,CAA0B,KAAK,CAAA;AAClE;AAEO,SAAS,iBAAiB,KAAA,EAAuC;AACtE,EAAA,OAAO,mBAAA,CAAoB,KAAK,CAAA,IAAK,yBAAA,CAA0B,KAAK,CAAA;AACtE;AAMO,SAAS,yBACd,KAAA,EACsC;AACtC,EAAA,OAAO,YAAA,CAAa,KAAK,CAAA,IAAK,gBAAA,CAAiB,KAAK,CAAA;AACtD;AAQO,SAAS,kBAAkB,MAAA,EAAwC;AACxE,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC/B,IAAA,IAAI,eAAA,CAAgB,KAAK,CAAA,EAAG,OAAO,CAAC,KAAK,CAAA;AACzC,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,WAAA,EAAa,OAAO,EAAC;AAE7C,IAAA,MAAM,wBAAA,CAAyB,QAAQ,KAAK,CAAA;AAAA,EAC9C,CAAC,CAAA;AACH;AAQO,SAAS,eAAe,MAAA,EAAwC;AACrE,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC/B,IAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG,OAAO,CAAC,KAAK,CAAA;AACtC,IAAA,IAAI,gBAAgB,KAAK,CAAA,IAAK,MAAM,SAAA,KAAc,WAAA,SAAoB,EAAC;AAEvE,IAAA,MAAM,wBAAA,CAAyB,QAAQ,KAAK,CAAA;AAAA,EAC9C,CAAC,CAAA;AACH;AAWO,SAAS,qBACd,KAAA,EACoB;AACpB,EAAA,2BAAA,CAA4B,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAM,wBAAA,CAAyB,SAAS,KAAK,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,IAAI,KAAA,CAAM,OAAA;AAAA,IACV,UAAU,KAAA,CAAM,cAAA;AAAA,IAChB,cAAc,KAAA,CAAM,YAAA;AAAA,IACpB,WAAW,KAAA,CAAM,SAAA;AAAA;AAAA,IAEjB,QAAQ,KAAA,CAAM,SAAA,KAAc,OAAA,GAAU,KAAA,CAAM,SAAS,KAAA,CAAM,OAAA;AAAA,IAC3D,gBAAgB,KAAA,CAAM;AAAA,GACxB;AAEA,EAAA,OAAO,OAAA;AACT;AAQO,SAAS,yBACd,KAAA,EACwB;AACxB,EAAA,+BAAA,CAAgC,KAAK,CAAA;AACrC,EAAA,IAAI,CAAC,mBAAA,CAAoB,KAAK,CAAA,EAAG;AAC/B,IAAA,MAAM,4BAAA,CAA6B,SAAS,KAAK,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,IAAI,KAAA,CAAM,OAAA;AAAA,IACV,UAAU,KAAA,CAAM,cAAA;AAAA,IAChB,YAAA,EAAc,IAAA;AAAA,IACd,SAAA,EAAW,WAAA;AAAA,IACX,MAAA,EAAQ,IAAA;AAAA,IACR,gBAAgB,KAAA,CAAM,cAAA;AAAA,IACtB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,IACxB,iBAAiB,KAAA,CAAM;AAAA,GACzB;AAEA,EAAA,OAAO,OAAA;AACT;AAQO,SAAS,gBACd,KAAA,EACmB;AACnB,EAAA,IAAI,eAAA,CAAgB,KAAK,CAAA,EAAG,OAAO,qBAAqB,KAAK,CAAA;AAC7D,EAAA,IAAI,mBAAA,CAAoB,KAAK,CAAA,EAAG,OAAO,yBAAyB,KAAK,CAAA;AAErE,EAAA,MAAM,IAAI,SAAA;AAAA,IACR,CAAA,sCAAA,EAAyC,aAAA,CAAc,KAAK,CAAC,CAAA,CAAA;AAAA,GAC/D;AACF;AAMO,SAAS,mBACd,KAAA,EAC0B;AAC1B,EAAA,IAAI,CAAC,wBAAA,CAAyB,KAAK,CAAA,EAAG,OAAO,IAAA;AAC7C,EAAA,OAAO,MAAM,SAAA,KAAc,WAAA,GACvB,yBAAyB,KAAK,CAAA,GAC9B,qBAAqB,KAAK,CAAA;AAChC;AAOO,SAAS,iBACd,MAAA,EACqB;AACrB,EAAA,OAAO,MAAA,CAAO,IAAI,eAAe,CAAA;AACnC;AAMO,SAAS,oBACd,MAAA,EACqB;AACrB,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC/B,IAAA,MAAM,OAAA,GAAU,mBAAmB,KAAK,CAAA;AACxC,IAAA,OAAO,OAAA,GAAU,CAAC,OAAO,CAAA,GAAI,EAAC;AAAA,EAChC,CAAC,CAAA;AACH;AAQO,SAAS,sBACd,MAAA,EACsB;AACtB,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC/B,IAAA,IAAI,gBAAgB,KAAK,CAAA,SAAU,CAAC,oBAAA,CAAqB,KAAK,CAAC,CAAA;AAC/D,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,WAAA,EAAa,OAAO,EAAC;AAE7C,IAAA,MAAM,wBAAA,CAAyB,SAAS,KAAK,CAAA;AAAA,EAC/C,CAAC,CAAA;AACH;;;AC9TA,IAAM,IAAA,GAAO,oEAAA;AAEb,IAAM,iBAAA,GAAgD;AAAA,EACpD;AAAA,IACE,eAAA,EAAiB,mEAAA;AAAA,IACjB,IAAA,EAAM,gBAAA;AAAA,IACN,GAAA,EAAK,2BAAA;AAAA,IACL,OAAA,EAAS,mCAAA;AAAA,IACT,SAAA,EAAW,oCAAA;AAAA,IACX,UAAA,EAAY,qCAAA;AAAA,IACZ,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAA,EAAgB,IAAA;AAAA,IAChB,oBAAA,EAAsB,IAAA;AAAA,IACtB,wBAAA,EAA0B,CAAA;AAAA,IAC1B,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,eAAA,EAAiB,mEAAA;AAAA,IACjB,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,0DAAA;AAAA,IACV,GAAA,EAAK,kBAAA;AAAA,IACL,OAAA,EAAS,wBAAA;AAAA,IACT,cAAA,EAAgB,IAAA;AAAA,IAChB,oBAAA,EAAsB;AAAA;AAE1B,CAAA;AAEA,IAAM,iBAAA,GAAgD;AAAA,EACpD;AAAA,IACE,eAAA,EAAiB,oEAAA;AAAA,IACjB,IAAA,EAAM,cAAA;AAAA,IACN,QAAA,EAAU,qCAAA;AAAA,IACV,GAAA,EAAK,yBAAA;AAAA,IACL,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAA,EAAgB,IAAA;AAAA,IAChB,oBAAA,EAAsB;AAAA,GACxB;AAAA,EACA;AAAA,IACE,eAAA,EAAiB,oEAAA;AAAA,IACjB,IAAA,EAAM,gBAAA;AAAA,IACN,QAAA,EAAU,qCAAA;AAAA,IACV,GAAA,EAAK,0BAAA;AAAA,IACL,OAAA,EAAS,2CAAA;AAAA,IACT,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAA,EAAgB,IAAA;AAAA,IAChB,oBAAA,EAAsB;AAAA,GACxB;AAAA,EACA;AAAA,IACE,eAAA,EAAiB,oEAAA;AAAA,IACjB,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,gCAAA;AAAA,IACL,OAAA,EAAS,gCAAA;AAAA,IACT,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAA,EAAgB,IAAA;AAAA,IAChB,oBAAA,EAAsB;AAAA,GACxB;AAAA,EACA;AAAA,IACE,eAAA,EAAiB,mEAAA;AAAA,IACjB,IAAA,EAAM,cAAA;AAAA,IACN,GAAA,EAAK,+BAAA;AAAA,IACL,OAAA,EAAS,6CAAA;AAAA,IACT,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAA,EAAgB,IAAA;AAAA,IAChB,oBAAA,EAAsB,IAAA;AAAA,IACtB,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,eAAA,EAAiB,mEAAA;AAAA,IACjB,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,0DAAA;AAAA,IACV,GAAA,EAAK,0CAAA;AAAA,IACL,OAAA,EAAS,gDAAA;AAAA,IACT,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAA,EAAgB,IAAA;AAAA,IAChB,oBAAA,EAAsB;AAAA;AAE1B,CAAA;AAIA,IAAM,aAAA,GAA4C,iBAAA,CAAkB,GAAA,CAAI,YAAY,CAAA;AACpF,IAAM,aAAA,GAA4C,iBAAA,CAAkB,GAAA,CAAI,YAAY,CAAA;AAEpF,SAAS,aAAa,IAAA,EAAwC;AAC5D,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,eAAA,EAAiB,gBAAA,CAAiB,IAAA,CAAK,eAAe,CAAA;AAAA,IACtD,sBAAsB,IAAA,CAAK,oBAAA,GACvB,gBAAA,CAAiB,IAAA,CAAK,oBAAoB,CAAA,GAC1C;AAAA,GACN;AACF;AAOO,SAAS,oBAAoB,KAAA,EAA0C;AAC5E,EAAA,MAAM,IAAA,GAAO,KAAA,KAAU,SAAA,GAAY,aAAA,GAAgB,aAAA;AAGnD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAChD,IAAA,MAAM,SAAA,GAAY,EAAE,QAAA,IAAY,KAAA;AAChC,IAAA,MAAM,SAAA,GAAY,EAAE,QAAA,IAAY,KAAA;AAChC,IAAA,IAAI,SAAA,KAAc,SAAA,EAAW,OAAO,SAAA,GAAY,CAAA,GAAI,EAAA;AACpD,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAAA,EACpC,CAAC,CAAA;AACH;AAMO,SAAS,mBAAA,CACd,OACA,eAAA,EAC6B;AAC7B,EAAA,MAAM,MAAA,GAAS,iBAAiB,eAAe,CAAA;AAC/C,EAAA,OAAO,mBAAA,CAAoB,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,oBAAoB,MAAM,CAAA;AAC5E;AAGO,SAAS,iBAAA,CAAkB,OAAuB,eAAA,EAAkC;AACzF,EAAA,OAAO,mBAAA,CAAoB,KAAA,EAAO,eAAe,CAAA,KAAM,MAAA;AACzD;AAmBO,SAAS,eAAA,CACd,OACA,eAAA,EACc;AACd,EAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,KAAA,EAAO,eAAe,CAAA;AACvD,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,MAAM,cAAA,IAAkB,IAAA;AAAA,IACxC,oBAAA,EAAsB,MAAM,oBAAA,IAAwB,IAAA;AAAA,IACpD,wBAAA,EAA0B,MAAM,wBAAA,IAA4B,CAAA;AAAA,IAC5D,mBAAmB,IAAA,EAAM,iBAAA;AAAA,IACzB,oBAAA,EAAsB,MAAM,oBAAA,IAAwB,KAAA;AAAA,IACpD,yBAAA,EAA2B,MAAM,yBAAA,IAA6B;AAAA,GAChE;AACF;ACyCO,SAAS,qBAAA,CACd,YAAA,EACA,OAAA,EACA,MAAA,EACM;AACN,EAAA,OAAO;AAAA,IACL,eAAA,EAAiB,YAAA;AAAA,IACjB,UAAA,EAAY,SAAA;AAAA,IACZ,QAAA,EAAUC,kBAAS,OAAA,CAAQ,CAAC,SAASC,gBAAA,CAAQ,WAAA,CAAY,MAAM,CAAC,CAAC;AAAA,GACnE;AACF;AA4BO,SAAS,wBAAA,CACd,gBACA,IAAA,EACM;AAKN,EAAA,MAAM,QAAA,GAAqB;AAAA,IACzBJ,YAAAA,CAAI,KAAA,CAAM,IAAA,CAAK,YAAY;AAAA;AAAA,GAC7B;AAEA,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,sBAAA,CAAuB,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,EAC9D,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,EACrB;AAGA,EAAA,IAAI,KAAK,aAAA,EAAe;AACtB,IAAA,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,aAAa,CAAA;AAAA,EACzC,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,EACrB;AAGA,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,SAAS,CAAA;AAAA,EACrC,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,EACrB;AAIA,EAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAGnB,EAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAC/D,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,KAAA;AAAA,MACAA,YAAAA,CAAI,KAAA,CAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAAA,MACvC,GAAG,IAAA,CAAK;AAAA,KACV;AAAA,EACF,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,EACrB;AACA,EAAA,QAAA,CAAS,KAAKA,YAAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAC,CAAA;AACvC,EAAA,QAAA,CAAS,KAAKA,YAAAA,CAAI,KAAA,CAAM,IAAA,CAAK,aAAA,IAAiB,CAAC,CAAC,CAAA;AAChD,EAAA,OAAO;AAAA,IACL,eAAA,EAAiB,cAAA;AAAA,IACjB,UAAA,EAAY,kBAAA;AAAA,IACZ;AAAA,GACF;AACF;AAGO,SAAS,oBAAA,CACd,gBACA,IAAA,EACM;AACN,EAAA,OAAO;AAAA,IACL,eAAA,EAAiB,cAAA;AAAA,IACjB,UAAA,EAAY,cAAA;AAAA,IACZ,QAAA,EAAUG,iBAAA,CAAS,OAAA,CAAQ,CAAC,IAAA,CAAK,cAAc,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,QAAQ,CAAC;AAAA,GAC7E;AACF;AAGO,SAAS,oBAAA,CACd,gBACA,IAAA,EACM;AAIN,EAAA,MAAM,WAAqB,CAACH,YAAAA,CAAI,KAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AACxD,EAAA,mBAAA,CAAoB,QAAA,EAAU,KAAK,MAAM,CAAA;AACzC,EAAA,OAAO;AAAA,IACL,eAAA,EAAiB,cAAA;AAAA,IACjB,UAAA,EAAY,cAAA;AAAA,IACZ;AAAA,GACF;AACF;AAgBO,SAAS,yBAAA,CACd,gBACA,IAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAWG,kBAAS,OAAA,CAAQ;AAAA,IAChC,yBAAyB,IAAA,CAAK,qBAAA;AAAA,IAC9B,QAAA,EAAU;AAAA;AAAA;AAAA,MAGR,MAAM,IAAA,CAAK,IAAA;AAAA;AAAA;AAAA;AAAA,MAIX,WAAA,EAAaE,kBAAA,CAAU,mBAAA,CAAoB,IAAA,CAAK,WAAW;AAAA,KAC7D;AAAA,IACA,QAAA,EAAU;AAAA,MACR,wBAAA,EAA0B,KAAK,QAAA,CAAS,sBAAA;AAAA,MACxC,sBAAA,EAAwB,KAAK,QAAA,CAAS,oBAAA;AAAA,MACtC,gBAAA,EAAkB,KAAK,QAAA,CAAS,cAAA;AAAA,MAChC,cAAA,EAAgB,KAAK,QAAA,CAAS,YAAA;AAAA,MAC9B,mBAAA,EAAqB,KAAK,QAAA,CAAS;AAAA,KACrC;AAAA,IACA,WAAA,EAAa;AAAA,MACX,cAAc,IAAA,CAAK,WAAA;AAAA,MACnB,aAAa,IAAA,CAAK,UAAA;AAAA,MAClB,SAAA,EAAW,KAAA;AAAA,MACX,SAAA,EAAW,KAAA;AAAA;AAAA,MAEX,UAAA,EAAY,IAAIC,oBAAA,CAAoBC,2BAAA,CAAmB,IAAI,CAAA;AAAA,MAC3D,QAAA,EAAU,IAAID,oBAAA,CAAoBC,2BAAA,CAAmB,IAAI;AAAA,KAC3D;AAAA,IACA,SAAA,EAAW,oBAAA,CAAqB,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC7C,iBAAA,EAAmB,4BAAA,CAA6B,IAAA,CAAK,gBAAgB,CAAA;AAAA,IACrE,kBAAA,EAAoB;AAAA,MAClB,SAAA,EAAW,KAAK,WAAA,CAAY,SAAA;AAAA,MAC5B,iBAAA,EAAmB,KAAK,WAAA,CAAY;AAAA,KACtC;AAAA,IACA,IAAA,EAAM,KAAK,IAAA,IAAQ,CAAA;AAAA,IACnB,cAAA,EAAgB,KAAK,aAAA,IAAiB;AAAA,GACvC,CAAA;AACD,EAAA,OAAO;AAAA,IACL,eAAA,EAAiB,cAAA;AAAA,IACjB,UAAA,EAAY,mBAAA;AAAA,IACZ;AAAA,GACF;AACF;AAYO,SAAS,iBAAA,CACd,gBACA,IAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AACpC,EAAA,MAAM,QAAA,GACJ,KAAK,KAAA,CAAM,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,aAAa,MAAA,GACnD,IAAID,qBAAoBC,2BAAA,CAAmB,IAAA,EAAM,KAAK,KAAA,CAAM,QAAQ,IACpE,IAAID,oBAAA,CAAoBC,4BAAmB,IAAI,CAAA;AACrD,EAAA,MAAM,QAAA,GAAWJ,kBAAS,OAAA,CAAQ;AAAA,IAChC,eAAe,IAAA,CAAK,YAAA;AAAA,IACpB,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO;AAAA,IACL,eAAA,EAAiB,cAAA;AAAA,IACjB,UAAA,EAAY,WAAA;AAAA,IACZ;AAAA,GACF;AACF;AAEA,SAAS,YAAY,IAAA,EAAkC;AAKrD,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,OAAO,IAAIF,wBAAAA,CAAgB;AAAA,MACzB,KAAA,EAAO;AAAA,QACL,eAAe,IAAA,CAAK,YAAA;AAAA,QACpB,UAAA,EAAY,eAAA,CAAgB,IAAA,CAAK,SAAS;AAAA,OAC5C;AAAA,MACA,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAGA,EAAA,OAAO,IAAIA,wBAAAA,CAAgB;AAAA,IACzB,KAAA,EAAO,MAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK;AAAA;AACf,GACD,CAAA;AACH;AAEA,SAAS,gBAAgB,IAAA,EAAsC;AAC7D,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AAGzB,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,iBAAA,KAAsB,MAAA,EAAW;AAC7D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAUA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,GACtB,IAAIK,oBAAA;AAAA,MACFC,2BAAA,CAAmB,IAAA;AAAA,MACnB,kBAAA,CAAmB,KAAK,YAAY;AAAA,KACtC,GACA,IAAID,oBAAA,CAA6BC,2BAAA,CAAmB,IAAI,CAAA;AAC5D,IAAA,MAAM,oBACJ,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,iBAAA,KAAsB,SAC5C,IAAID,oBAAA;AAAA,MACFC,2BAAA,CAAmB,IAAA;AAAA,MACnB,IAAA,CAAK;AAAA,KACP,GACA,IAAID,oBAAA,CAAoBC,2BAAA,CAAmB,IAAI,CAAA;AACrD,IAAA,OAAO,IAAIN,wBAAAA,CAAgB;AAAA,MACzB,KAAA,EAAO;AAAA,QACL,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,YAAA;AAAA,QACA,kBAAA,EAAoB;AAAA,OACtB;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AACA,EAAA,OAAO,IAAIA,wBAAAA,CAAgB;AAAA,IACzB,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,EAAE,EAAA,EAAI,IAAA,CAAK,OAAA;AAAQ,GAC5B,CAAA;AACH;AAgBA,SAAS,qBACP,GAAA,EAC8B;AAC9B,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,IAAIK,oBAAA,CAA6BC,4BAAmB,IAAI,CAAA;AACzE,EAAA,MAAM,OAAA,GAA2B;AAAA,IAC/B,eAAe,GAAA,CAAI,YAAA;AAAA,IACnB,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,0BAA0B,GAAA,CAAI,sBAAA;AAAA,IAC9B,oBAAoB,GAAA,CAAI,gBAAA;AAAA,IACxB,cAAc,GAAA,CAAI,WAAA;AAAA,IAClB,YAAA,EAAc,kBAAA,CAAmB,GAAA,CAAI,YAAY,CAAA;AAAA,IACjD,oBAAoB,GAAA,CAAI;AAAA,GAC1B;AAIA,EAAA,OAAO,IAAID,oBAAA;AAAA,IACTC,2BAAA,CAAmB,IAAA;AAAA,IACnB,IAAIN,wBAAAA,CAAgB,EAAE,SAAS,OAAA,EAAS,SAAA,EAAW,QAAW;AAAA,GAChE;AACF;AAOA,SAAS,6BACP,GAAA,EACsC;AACtC,EAAA,IAAI,CAAC,GAAA;AACH,IAAA,OAAO,IAAIK,oBAAA,CAAqCC,2BAAA,CAAmB,IAAI,CAAA;AACzE,EAAA,OAAO,IAAID,oBAAA,CAAqCC,2BAAA,CAAmB,IAAA,EAAM;AAAA,IACvE,aAAa,GAAA,CAAI,UAAA;AAAA,IACjB,sBAAA,EAAwB,0BAAA,CAA2B,GAAA,CAAI,IAAI;AAAA,GAC5D,CAAA;AACH;AAEA,SAAS,2BACP,IAAA,EACiB;AAGjB,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,OAAO,IAAIN,wBAAAA,CAAgB;AAAA,MACzB,OAAO,IAAA,CAAK,YAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAG7B,IAAA,OAAO,IAAIA,wBAAAA,CAAgB;AAAA,MACzB,KAAA,EAAO,MAAA;AAAA,MACP,SAAA,EAAW;AAAA,QACT,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAQ,IAAA,CAAK;AAAA;AACf,KACD,CAAA;AAAA,EACH;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,oCAAA,EAAwC,KAA0B,IAAI,CAAA;AAAA,GACxE;AACF;AAKA,SAAS,YAAY,MAAA,EAAwB;AAC3C,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,EAAE,CAAA;AAC/B;AASA,SAAS,mBAAmB,CAAA,EAAsC;AAChE,EAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACvB,IAAA,OAAO,IAAIA,wBAAAA,CAAgB;AAAA,MACzB,MAAA,EAAQ,WAAA,CAAY,CAAA,CAAE,MAAM,CAAA;AAAA,MAC5B,WAAA,EAAa,MAAA;AAAA,MACb,OAAA,EAAS,MAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,aAAA,EAAe;AAC5B,IAAA,OAAO,IAAIA,wBAAAA,CAAgB;AAAA,MACzB,MAAA,EAAQ,MAAA;AAAA,MACR,WAAA,EAAa,WAAA,CAAY,CAAA,CAAE,MAAM,CAAA;AAAA,MACjC,OAAA,EAAS,MAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAGA,EAAA,OAAO,IAAIA,wBAAAA,CAAgB;AAAA,IACzB,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa,MAAA;AAAA,IACb,SAAS,EAAC;AAAA,IACV,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAEA,SAAS,mBAAA,CAAoB,KAAe,MAAA,EAA0B;AAOpE,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,cAAA;AACH,MAAA,GAAA,CAAI,IAAA,CAAK,OAAO,KAAA,EAAO,KAAA,EAAOD,aAAI,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AACvD,MAAA;AAAA,IACF,KAAK,mBAAA;AACH,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,KAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACAA,YAAAA,CAAI,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AAAA,QACxBA,YAAAA,CAAI,KAAA,CAAM,MAAA,CAAO,cAAc;AAAA,OACjC;AACA,MAAA;AAAA,IACF,KAAK,iBAAA;AAEH,MAAA,GAAA,CAAI,KAAK,KAAA,EAAO,KAAA,EAAOA,aAAI,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AAChD,MAAA,IAAI,MAAA,CAAO,YAAY,MAAA,EAAW;AAChC,QAAA,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,MAChB;AACA,MAAA,GAAA,CAAI,IAAA;AAAA,QACFA,YAAAA,CAAI,KAAA,CAAM,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA;AAAA,QACpC,GAAG,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAMA,YAAAA,CAAI,KAAA,CAAM,CAAC,CAAC;AAAA,OAChD;AACA,MAAA;AAAA,IACF,KAAK,oBAAA;AACH,MAAA,GAAA,CAAI,IAAA,CAAK,OAAO,KAAA,EAAO,KAAA,EAAOA,aAAI,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAC,CAAA;AACxD,MAAA;AAAA,IACF,KAAK,8BAAA;AACH,MAAA,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAC5B,MAAA;AAAA,IACF,KAAK,wBAAA;AACH,MAAA,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAC5B,MAAA;AAAA,IACF,KAAK,kBAAA;AACH,MAAA,GAAA,CAAI,IAAA,CAAK,OAAO,KAAA,EAAO,KAAA,EAAOA,aAAI,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AACvD,MAAA;AAAA,IACF,KAAK,wBAAA;AACH,MAAA,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAC5B,MAAA;AAAA,IACF,KAAK,qBAAA,EAAuB;AAE1B,MAAA,GAAA,CAAI,IAAA,CAAK,OAAO,KAAK,CAAA;AACrB,MAAA,IAAI,MAAA,CAAO,YAAY,MAAA,EAAW;AAChC,QAAA,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,MAChB;AACA,MAAA,GAAA,CAAI,IAAA;AAAA,QACFA,YAAAA,CAAI,KAAA,CAAM,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA;AAAA,QACnC,GAAG,OAAO,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAMA,YAAAA,CAAI,KAAA,CAAM,CAAC,CAAC;AAAA,OAC/C;AACA,MAAA;AAAA,IACF;AAAA;AAEJ;AAeA,IAAM,8BAA8BQ,aAAA,CAAK,mBAAA;AAAA,EACvC;AACF,CAAA;AAiBO,SAAS,4BAAA,CACd,SACA,cAAA,EACoB;AACpB,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KACjB,IAAA,CAAK,aAAY,CAAE,OAAA,CAAQ,SAAS,IAAI,CAAA;AAC1C,EAAA,MAAM,YAAA,GAAe,UAAU,cAAc,CAAA;AAG7C,EAAA,MAAM,eAAA,GAAkB,OAAO,2BAA2B,CAAA;AAC1D,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,MAAA,IAAU,EAAC,EAAG;AACxC,IAAA,IAAI,CAAC,MAAM,YAAA,IAAgB,CAAC,MAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACjE,IAAA,IAAI,SAAA,CAAU,KAAA,CAAM,YAAY,CAAA,KAAM,YAAA,EAAc;AACpD,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAE,MAAM,eAAA,EAAiB;AAChD,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAE,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;AAIA,SAAS,uBAAuB,CAAA,EAAmB;AACjD,EAAA,IAAI,EAAE,MAAA,GAAS,EAAA;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,CAAA,CAAE,MAAM,CAAA,MAAA,CAAQ,CAAA;AAClE,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,MAAW,QAAQ,CAAA,EAAG;AACpB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAC9B,IAAA,IAAI,IAAA,GAAO,GAAA,EAAM,MAAM,IAAI,MAAM,qCAAqC,CAAA;AACtE,IAAA,KAAA,GAAS,KAAA,IAAS,EAAA,GAAM,MAAA,CAAO,IAAI,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,EAAE,CAAA;AACjC;;;AC5vBA,IAAM,YAAA,GAAe,MAAA;AAYrB,SAAS,qBAAA,CACP,SAAA,EACA,MAAA,EACA,gBAAA,EACU;AACV,EAAA,IAAI,SAAA,IAAa,CAAA,EAAG,OAAO,EAAC;AAE5B,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,qBAAqB,SAAA,EAAW;AAClC,IAAA,GAAA,GAAM,KAAA,CAAM,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AAAA,EAC/B,CAAA,MAAA,IAAW,qBAAqB,QAAA,EAAU;AACxC,IAAA,GAAA,GAAM,EAAC;AACP,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,MAAA,MAAM,gBAAgB,SAAA,GAAY,CAAA;AAClC,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,GAAA,CAAK,aAAA,GAAgB,CAAA,KAAM,SAAS,EAAA,CAAG,CAAA;AAAA,IAClD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,GAAA,GAAM,EAAC;AACP,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,MAAA,GAAA,CAAI,KAAK,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,SAAA,EAAW,MAAM,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,UAAU,CAAA,EAAG,OAAO,MAAM,SAAS,CAAA,CAAE,KAAK,CAAC,CAAA;AAE/C,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM,KAAK,KAAA,CAAO,CAAA,GAAI,KAAA,GAAS,GAAG,CAAC,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAC1D,EAAA,IAAI,cAAc,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,GAAK,SAAA;AAClD,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,KAAK,GAAG,CAAA;AACtC;AAoBA,IAAM,UAAA,GAA+C;AAAA,EACnD,MAAA,EAAQ,QAAA;AAAA,EACR,WAAA,EAAa,aAAA;AAAA,EACb,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAcO,SAAS,kBAAkB,IAAA,EAAmC;AACnE,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,CAAA,EAAE;AAAA,EACtC;AAGA,EAAA,MAAM,QAAA,GAAW,IAAA;AACjB,EAAA,IAAI,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,MAAM,OAAO,UAAA,CAAW,QAAA,CAAS,IAAA,CAAK,WAAA,EAAa,CAAA,IAAK,SAAA;AACxD,IAAA,OAAO,EAAE,MAAM,IAAA,EAAM,MAAA,EAAQ,OAAO,QAAA,CAAS,MAAA,IAAU,CAAC,CAAA,EAAE;AAAA,EAC5D;AAGA,EAAA,MAAM,GAAA,GAAQ,KAA+C,OAAA,IAC1D,IAAA;AAEH,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAC3C,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,WAAA,EAAa,CAAA;AAC5C,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,SAAS,SAAA,EAAW,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAA,EAAE;AAE5D,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,IAAI,EAAC;AAClE,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,CAAA,EAAG,eAAe,GAAA,EAAI;AAAA,IACzD;AAGA,IAAA,IAAI,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AACvF,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAC7C;AACA,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,UAAU,KAAA,EAAO;AAClE,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,QAAQ,MAAA,CAAQ,KAAA,CAA4B,IAAI,CAAA,EAAE;AAAA,IACzE;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAE;AAAA,EACjC;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,CAAA,EAAE;AACtC;AAOO,SAAS,kBAAkB,KAAA,EAGX;AACrB,EAAA,MAAM,IAAA,GAAO,WAAW,MAAA,CAAO,KAAA,CAAM,oBAAoB,SAAS,CAAA,CAAE,WAAA,EAAa,CAAA,IAAK,SAAA;AACtF,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,OAAO,EAAE,MAAM,MAAA,EAAQ,CAAA,EAAG,eAAe,KAAA,CAAM,kBAAA,IAAsB,EAAC,EAAE;AAAA,EAC1E;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,CAAM,sBAAsB,EAAA,EAAG;AACxD;AAaO,SAAS,uBAAA,CACd,MACA,KAAA,EACU;AACV,EAAA,IAAI,KAAA,IAAS,CAAA,EAAG,OAAO,EAAC;AAExB,EAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,aAAA,IAAiB,EAAC;AAClC,IAAA,IAAI,EAAA,CAAG,WAAW,KAAA,EAAO,OAAO,GAAG,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,GAAK,GAAG,CAAA;AACvD,IAAA,OAAO,qBAAA,CAAsB,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,QAAA,GACJ,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,KAAS,aAAA,IAAiB,IAAA,CAAK,IAAA,KAAS,SAAA,GACnE,IAAA,CAAK,IAAA,GACL,SAAA;AAEN,EAAA,OAAO,qBAAA,CAAsB,KAAA,EAAO,IAAA,CAAK,MAAA,GAAS,IAAI,QAAQ,CAAA;AAChE;AA8BA,SAAS,GAAA,CAAI,OAAe,KAAA,EAA0C;AACpE,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,IAAS,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAA,IAAK,GAAG,OAAO,EAAA;AACnB,EAAA,OAAQ,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,GAAK,YAAA;AAC/B;AAUO,SAAS,cAAc,KAAA,EAA0C;AACtE,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,CAAM,MAAA,IAAU,CAAC,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,UAAA,IAAc,CAAC,CAAA;AACtE,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,sBAAA,IAA0B,CAAC,CAAA;AACxD,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,gBAAA,IAAoB,CAAC,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,WAAA,IAAe,CAAC,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,gBAAA,IAAoB,CAAC,CAAA;AACnD,EAAA,MAAM,iBAAA,GAAoB,KAAK,GAAA,CAAI,CAAA,EAAG,MAAQ,OAAA,GAAU,IAAA,GAAO,SAAS,QAAQ,CAAA;AAChF,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,YAAA,EAAe,KAAA,GAAQ,MAAA,CAAO,iBAAiB,CAAA,GAAK,YAAA;AAAA,IACpD,iBAAA,EAAmB,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AAAA,IACrC,WAAA,EAAa,GAAA,CAAI,KAAA,EAAO,IAAI,CAAA;AAAA,IAC5B,MAAA,EAAQ,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AAAA,IACzB,WAAA,EAAa,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAAA,IAChC;AAAA,GACF;AACF;AAmBO,SAAS,sBAAA,CACd,OACA,QAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,iBAAA,IAAqB,CAAC,CAAA;AACrD,EAAA,IAAI,aAAa,CAAA,IAAK,QAAA,GAAW,CAAA,IAAK,QAAA,GAAW,WAAW,OAAO,EAAA;AAEnE,EAAA,MAAM,KAAA,GAAQ,cAAc,KAAK,CAAA;AACjC,EAAA,IAAI,KAAA,CAAM,YAAA,IAAgB,EAAA,EAAI,OAAO,EAAA;AAErC,EAAA,MAAM,OAAO,uBAAA,CAAwB,iBAAA,CAAkB,KAAA,CAAM,YAAY,GAAG,SAAS,CAAA;AACrF,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA,IAAK,CAAA;AAClC,EAAA,IAAI,GAAA,IAAO,GAAG,OAAO,EAAA;AAErB,EAAA,OAAQ,KAAA,CAAM,eAAe,MAAA,CAAO,IAAA,CAAK,MAAM,GAAA,GAAM,GAAK,CAAC,CAAA,GAAK,QAAA;AAClE;AAQO,SAAS,kBAAA,CAAmB,OAAc,QAAA,EAA0B;AACzE,EAAA,IAAI,KAAA,CAAM,SAAA,KAAc,OAAA,EAAS,OAAO,EAAA;AACxC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,iBAAA,IAAqB,CAAC,CAAA;AACrD,EAAA,IAAI,aAAa,CAAA,IAAK,QAAA,GAAW,CAAA,IAAK,QAAA,GAAW,WAAW,OAAO,EAAA;AAEnE,EAAA,MAAM,IAAA,GAAO,uBAAA,CAAwB,iBAAA,CAAkB,KAAK,GAAG,SAAS,CAAA;AACxE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA,IAAK,CAAA;AAClC,EAAA,IAAI,GAAA,IAAO,GAAG,OAAO,EAAA;AACrB,EAAA,OAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,IAAU,GAAG,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAK,CAAC,CAAA,GAAK,QAAA;AAC3E;;;ACpPO,SAAS,oBACd,KAAA,EACmB;AACnB,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAwB;AACpD,EAAA,KAAA,MAAW,KAAK,KAAA,CAAM,WAAA,kBAA6B,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAE9D,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAqB;AACpD,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,MAAA,EAAQ;AAC5B,IAAA,IAAI,IAAA,GAAO,kBAAA,CAAmB,GAAA,CAAI,CAAA,CAAE,YAAY,CAAA;AAChD,IAAA,IAAI,CAAC,MAAM,kBAAA,CAAmB,GAAA,CAAI,EAAE,YAAA,EAAe,IAAA,GAAO,EAAG,CAAA;AAC7D,IAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACb;AAGA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,cAAA,EAAgB;AACpC,IAAA,IAAI,CAAC,EAAE,OAAA,EAAS;AAChB,IAAA,MAAM,GAAA,GAAM,eAAe,CAAC,CAAA;AAC5B,IAAA,IAAI,GAAA,cAAiB,GAAA,CAAI,CAAA,EAAG,EAAE,YAAY,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAAA,EACrD;AAEA,EAAA,MAAM,MAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,SAAA,IAAa,MAAM,UAAA,EAAY;AACxC,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,GAAA,CAAI,SAAA,CAAU,YAAY,CAAA;AAC7D,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,IAAA,IAAQ,CAAA,CAAA,EAAI,WAAW,EAAE,CAAA,CAAA;AAC3D,IAAA,MAAM,MAAM,SAAA,CAAU,QAAA;AAGtB,IAAA,MAAM,KAAK,UAAA,CAAW,QAAA;AACtB,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,EAAA,EAAI,iBAAA,IAAqB,CAAC,CAAA;AACrD,IAAA,IAAI,EAAA,IAAM,EAAA,CAAG,YAAA,IAAgB,WAAA,IAAe,GAAA,EAAK;AAC/C,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,SAAA,CAAU,YAAY,sBAAsB,GAAG,CAAA,CAAA;AACnE,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,QAAA,MAAM,MAAA,GAAS,sBAAA;AAAA,UACb;AAAA,YACE,MAAA,EAAQ,GAAG,MAAA,IAAU,GAAA;AAAA,YACrB,UAAA,EAAY,WAAW,UAAA,IAAc,CAAA;AAAA,YACrC,wBAAwB,EAAA,CAAG,sBAAA;AAAA,YAC3B,kBAAkB,EAAA,CAAG,gBAAA;AAAA,YACrB,aAAa,EAAA,CAAG,WAAA;AAAA,YAChB,kBAAkB,UAAA,CAAW,gBAAA;AAAA,YAC7B,cAAc,EAAA,CAAG,YAAA;AAAA,YACjB,iBAAA,EAAmB;AAAA,WACrB;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,SAAS,EAAA,EAAI;AACf,UAAA,GAAA,CAAI,IAAA,CAAK;AAAA,YACP,cAAc,SAAA,CAAU,YAAA;AAAA,YACxB,cAAA;AAAA,YACA,MAAA,EAAQ,oBAAA;AAAA,YACR,QAAA,EAAU,GAAA;AAAA,YACV,cAAc,EAAA,CAAG,YAAA;AAAA,YACjB,SAAA,EAAW,OAAA;AAAA,YACX,MAAA;AAAA,YACA,MAAA,EAAQ,EAAE,IAAA,EAAM,oBAAA,EAAsB,UAAU,GAAA;AAAI,WACrD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,SAAS,kBAAA,CAAmB,GAAA,CAAI,UAAU,YAAY,CAAA,IAAK,EAAC,EAAG;AAIxE,MAAA,IAAI,CAAC,eAAA,CAAgB,KAAK,CAAA,EAAG;AAE7B,MAAA,MAAM,EAAA,GAAK,MAAM,iBAAA,IAAqB,CAAA;AACtC,MAAA,MAAM,EAAA,GAAK,MAAM,cAAA,IAAkB,CAAA;AACnC,MAAA,MAAM,QAAA,GAAW,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,CAAA;AACtC,MAAA,MAAM,aAAA,GAAgB,EAAA,IAAM,GAAA,IAAO,EAAA,KAAO,CAAA;AAC1C,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,aAAA,EAAe;AAEjC,MAAA,MAAM,SAAA,GACJ,KAAA,CAAM,SAAA,KAAc,QAAA,GAAW,QAAA,GAAW,OAAA;AAE5C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAMC,YAAW,CAAA,EAAG,SAAA,CAAU,YAAY,CAAA,cAAA,EAAiB,MAAM,OAAO,CAAA,CAAA;AACxE,QAAA,IAAI,WAAA,CAAY,GAAA,CAAIA,SAAQ,CAAA,EAAG;AAC/B,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,cAAc,SAAA,CAAU,YAAA;AAAA,UACxB,cAAA;AAAA,UACA,MAAA,EAAQ,gBAAA;AAAA,UACR,QAAA,EAAU,GAAA;AAAA,UACV,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,SAAA;AAAA,UACA,QAAQ,SAAA,KAAc,OAAA,GAAU,OAAO,KAAA,CAAM,MAAA,IAAU,GAAG,CAAA,GAAI,MAAA;AAAA,UAC9D,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,EAAE,IAAA,EAAM,cAAA,EAAgB,OAAA,EAAS,MAAM,OAAA;AAAQ,SACxD,CAAA;AACD,QAAA;AAAA,MACF;AAQA,MAAA,MAAM,WAAA,GAAc,GAAA;AACpB,MAAA,MAAM,QAAA,GAAW,GAAG,SAAA,CAAU,YAAY,sBAAsB,KAAA,CAAM,OAAO,IAAI,WAAW,CAAA,CAAA;AAC5F,MAAA,IAAI,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC/B,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,KAAA,EAAO,GAAG,CAAA;AAC5C,MAAA,IAAI,UAAU,EAAA,EAAI;AAClB,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,cAAc,SAAA,CAAU,YAAA;AAAA,QACxB,cAAA;AAAA,QACA,MAAA,EAAQ,qBAAA;AAAA,QACR,QAAA,EAAU,GAAA;AAAA,QACV,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,SAAA,EAAW,OAAA;AAAA,QACX,MAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,mBAAA;AAAA,UACN,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAMO,SAAS,eAAA,CACd,SACA,cAAA,EACQ;AACR,EAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,CAAA,KAClB,oBAAA,CAAqB,cAAA,EAAgB;AAAA,MACnC,cAAc,CAAA,CAAE,YAAA;AAAA,MAChB,QAAQ,CAAA,CAAE;AAAA,KACX;AAAA,GACH;AACF;AAOA,SAAS,eAAe,CAAA,EAA+B;AACrD,EAAA,QAAQ,EAAE,SAAA;AAAW,IACnB,KAAK,cAAA;AACH,MAAA,OAAO,CAAA,CAAE,OAAA,GAAU,CAAA,aAAA,EAAgB,CAAA,CAAE,OAAO,CAAA,CAAA,GAAK,IAAA;AAAA,IACnD,KAAK,mBAAA;AACH,MAAA,OAAO,CAAA,CAAE,OAAA,IAAW,IAAA,IAAQ,CAAA,CAAE,WAAA,IAAe,IAAA,GACzC,CAAA,kBAAA,EAAqB,CAAA,CAAE,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,WAAW,CAAA,CAAA,GAC/C,IAAA;AAAA,IACN,KAAK,oBAAA;AACH,MAAA,OAAO,EAAE,QAAA,IAAY,IAAA,GAAO,CAAA,kBAAA,EAAqB,CAAA,CAAE,QAAQ,CAAA,CAAA,GAAK,IAAA;AAAA,IAClE;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AC/LA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,OAAO,KAAA,KAAU,YAAY,SAAA,GAAY,YAAA;AAC3C;AAOO,SAAS,mBAAA,CACd,OACA,IAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQC,iCAAA,CAAsB,UAAA,CAAW,KAAK,CAAC,CAAA;AACrD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AACH,MAAA,IAAI,CAAC,KAAA,CAAM,eAAA;AACT,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAE,CAAA;AAC3D,MAAA,OAAO,KAAA,CAAM,eAAA;AAAA,IACf,KAAK,cAAA;AACH,MAAA,IAAI,CAAC,KAAA,CAAM,qBAAA;AACT,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAE,CAAA;AACjE,MAAA,OAAO,KAAA,CAAM,qBAAA;AAAA,IACf,KAAK,YAAA;AACH,MAAA,IAAI,CAAC,KAAA,CAAM,mBAAA;AACT,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,KAAK,CAAA,CAAE,CAAA;AAC/D,MAAA,OAAO,KAAA,CAAM,mBAAA;AAAA,IACf,KAAK,YAAA;AACH,MAAA,IAAI,CAAC,KAAA,CAAM,mBAAA;AACT,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,KAAK,CAAA,CAAE,CAAA;AAC/D,MAAA,OAAO,KAAA,CAAM,mBAAA;AAAA;AAEnB;AAEA,IAAM,QAAA,GAAA,CAAY,MAAM,IAAA,IAAQ,EAAA;AAGzB,SAAS,cAAc,KAAA,EAAiC;AAC7D,EAAA,IAAI,KAAA,GAAQ,EAAA,EAAI,MAAM,IAAI,MAAM,yBAAyB,CAAA;AACzD,EAAA,IAAI,KAAA,GAAQ,QAAA;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,KAAA,CAAM,QAAA,EAAU,CAAA,CAAE,CAAA;AAC/D,EAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,IAAA,IAAQ,EAAA;AAC5B,EAAA,OAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,QAAA,KAAa,KAAA,IAAS,IAAA,EAAM,UAAU,CAAA;AAC/D;AA0BO,SAAS,wBAAwB,GAAA,EAAmC;AACzE,EAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,aAAA,CAAc,IAAI,YAAY,CAAA;AACrD,EAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,aAAA,CAAc,IAAI,YAAY,CAAA;AACrD,EAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,aAAA,CAAc,IAAI,aAAa,CAAA;AACtD,EAAA,OAAO;AAAA,IACL,GAAA,CAAI,YAAA;AAAA,IACJ,KAAA;AAAA,IAAO,KAAA;AAAA,IACP,KAAA;AAAA,IAAO,KAAA;AAAA,IACP,KAAA;AAAA,IAAO,KAAA;AAAA,IACP,MAAA,CAAO,IAAI,UAAU,CAAA;AAAA,IACrB,GAAA,CAAI,WAAW,GAAA,GAAM;AAAA,GACvB;AACF;AA4BO,SAAS,sBAAsB,GAAA,EAAiC;AACrE,EAAA,OAAO;AAAA,IACL,MAAA,CAAO,GAAA,CAAI,cAAA,CAAe,MAAM,CAAA;AAAA,IAChC,GAAG,GAAA,CAAI,cAAA;AAAA,IACP,GAAA,CAAI,UAAU,QAAA,EAAS;AAAA,IACvB,GAAA,CAAI,cAAc,QAAA,EAAS;AAAA,IAC3B,MAAA,CAAO,IAAI,UAAU,CAAA;AAAA,IACrB,GAAA,CAAI,WAAW,GAAA,GAAM;AAAA,GACvB;AACF;AAYO,SAAS,kBAAkB,GAAA,EAA6B;AAC7D,EAAA,OAAO,CAAC,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAC5B;AA+BO,SAAS,+BACd,GAAA,EACU;AACV,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,WAAA,KAAgB,KAAA,GAAQ,GAAA,GAAM,GAAA;AACxD,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,GAAA,CAAI,cAAA,IAAkB,CAAC,CAAA;AACrD,EAAA,MAAM,eACJ,GAAA,CAAI,WAAA,KAAgB,QAAQ,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA,GAAI,GAAA;AACzD,EAAA,OAAO,CAAC,aAAA,EAAe,cAAA,EAAgB,YAAA,EAAc,GAAG,IAAI,aAAa,CAAA;AAC3E","file":"index.cjs","sourcesContent":["export class BudokanError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BudokanError\";\n }\n}\n\nexport class BudokanApiError extends BudokanError {\n readonly status: number;\n readonly statusText: string;\n\n constructor(message: string, status: number, statusText: string = \"\") {\n super(message);\n this.name = \"BudokanApiError\";\n this.status = status;\n this.statusText = statusText;\n }\n}\n\nexport class BudokanTimeoutError extends BudokanError {\n constructor(message = \"Request timed out\") {\n super(message);\n this.name = \"BudokanTimeoutError\";\n }\n}\n\nexport class BudokanConnectionError extends BudokanError {\n constructor(message = \"Connection failed\") {\n super(message);\n this.name = \"BudokanConnectionError\";\n }\n}\n\nexport class TournamentNotFoundError extends BudokanError {\n readonly tournamentId: string;\n\n constructor(tournamentId: string) {\n super(`Tournament not found: ${tournamentId}`);\n this.name = \"TournamentNotFoundError\";\n this.tournamentId = tournamentId;\n }\n}\n\nexport class RpcError extends BudokanError {\n readonly contractAddress?: string;\n\n constructor(message: string, contractAddress?: string) {\n super(message);\n this.name = \"RpcError\";\n this.contractAddress = contractAddress;\n }\n}\n\nexport class DataSourceError extends BudokanError {\n readonly primaryError: Error;\n readonly fallbackError: Error;\n\n constructor(primaryError: Error, fallbackError: Error) {\n super(`Both data sources failed. Primary: ${primaryError.message}. Fallback: ${fallbackError.message}`);\n this.name = \"DataSourceError\";\n this.primaryError = primaryError;\n this.fallbackError = fallbackError;\n }\n}\n\nexport function isNonRetryableError(error: unknown): boolean {\n if (error instanceof TournamentNotFoundError) return true;\n if (error instanceof BudokanApiError && error.status >= 400 && error.status < 500 && error.status !== 429) {\n return true;\n }\n return false;\n}\n","import { isNonRetryableError, BudokanTimeoutError } from \"../errors/index.js\";\n\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number,\n maxDelay: number,\n): number {\n let delay = baseDelay * Math.pow(2, attempt);\n if (delay > maxDelay) delay = maxDelay;\n const minDelay = delay / 2;\n const jitter = Math.random() * (delay - minDelay);\n return minDelay + jitter;\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n attempts: number = 3,\n delay: number = 1000,\n): Promise<T> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (isNonRetryableError(error)) {\n throw error;\n }\n\n if (attempt === attempts - 1) break;\n\n const backoff = calculateBackoff(attempt, delay, delay * 8);\n await sleep(backoff);\n }\n }\n\n throw lastError ?? new BudokanTimeoutError(\"Unknown error after retries\");\n}\n","import { BudokanApiError, BudokanTimeoutError, BudokanConnectionError } from \"../errors/index.js\";\nimport { withRetry } from \"../utils/retry.js\";\n\nexport interface ApiFetchOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: unknown;\n signal?: AbortSignal;\n timeout?: number;\n retryAttempts?: number;\n retryDelay?: number;\n}\n\nconst DEFAULT_TIMEOUT = 10_000;\nconst DEFAULT_RETRY_ATTEMPTS = 3;\nconst DEFAULT_RETRY_DELAY = 1000;\n\n/**\n * Fetch JSON from an API endpoint with retry logic, timeout, and error handling.\n */\nexport async function apiFetch<T>(url: string, options: ApiFetchOptions = {}): Promise<T> {\n const {\n method = \"GET\",\n headers = {},\n body,\n signal,\n timeout = DEFAULT_TIMEOUT,\n retryAttempts = DEFAULT_RETRY_ATTEMPTS,\n retryDelay = DEFAULT_RETRY_DELAY,\n } = options;\n\n return withRetry(\n async () => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n // Link external signal\n if (signal) {\n if (signal.aborted) {\n clearTimeout(timeoutId);\n throw new BudokanTimeoutError(\"Request was aborted\");\n }\n signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({}));\n throw new BudokanApiError(\n (errorBody as Record<string, string>).error ?? `API error: ${response.status}`,\n response.status,\n response.statusText,\n );\n }\n\n return (await response.json()) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof BudokanApiError) {\n throw error;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n if (signal?.aborted) throw new BudokanTimeoutError(\"Request was aborted\");\n throw new BudokanTimeoutError();\n }\n throw new BudokanConnectionError(\n error instanceof Error ? error.message : \"Connection failed\",\n );\n }\n },\n retryAttempts,\n retryDelay,\n );\n}\n\n/**\n * Extract pagination from API response.\n * The API wraps pagination in a `pagination` object, but the SDK\n * PaginatedResult type uses flat fields (total, limit, offset).\n */\nexport function extractPagination(result: Record<string, unknown>, defaults?: { limit?: number; offset?: number }): {\n total: number | undefined;\n limit: number;\n offset: number;\n} {\n const pagination = result.pagination as { total?: number; limit?: number; offset?: number } | undefined;\n return {\n total: pagination?.total ?? (result.total as number | undefined),\n limit: pagination?.limit ?? (result.limit as number | undefined) ?? defaults?.limit ?? 50,\n offset: pagination?.offset ?? (result.offset as number | undefined) ?? defaults?.offset ?? 0,\n };\n}\n\n/**\n * Build a query string from a record of key-value pairs.\n * Undefined and null values are omitted.\n */\nexport function buildQueryString(params: Record<string, string | number | boolean | undefined | null>): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n qs.set(key, String(value));\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n","/**\n * Convert a snake_case string to camelCase.\n */\nfunction toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\n/**\n * Convert a camelCase string to snake_case.\n */\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Deeply convert all keys in an object from snake_case to camelCase.\n */\nexport function snakeToCamel<T>(obj: unknown): T {\n if (Array.isArray(obj)) {\n return obj.map((item) => snakeToCamel(item)) as T;\n }\n if (obj !== null && typeof obj === \"object\" && !(obj instanceof Date)) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[toCamelCase(key)] = snakeToCamel(value);\n }\n return result as T;\n }\n return obj as T;\n}\n\n/**\n * Deeply convert all keys in an object from camelCase to snake_case.\n */\nexport function camelToSnake<T>(obj: unknown): T {\n if (Array.isArray(obj)) {\n return obj.map((item) => camelToSnake(item)) as T;\n }\n if (obj !== null && typeof obj === \"object\" && !(obj instanceof Date)) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[toSnakeCase(key)] = camelToSnake(value);\n }\n return result as T;\n }\n return obj as T;\n}\n","/**\n * Tournament phase derivation — the single source of truth for \"what phase is\n * this tournament in right now?\", mirroring the contract exactly\n * (`packages/budokan/src/libs/schedule.cairo::current_phase`).\n *\n * The client used to recompute this inline (`isStarted/isEnded/isSubmitted`);\n * this generalizes it so the client, bot, and any integration agree with the\n * chain on phase boundaries (all comparisons are strict `<`, so a boundary\n * second belongs to the *later* phase, matching the Cairo `if` ladder).\n */\n\nimport type { Phase } from \"../types/tournament.js\";\n\n/** Minimal schedule + creation-time shape needed to derive a phase. Matches\n * the relevant subset of `Tournament` (top-level delay fields + on-chain\n * created-at), so a full `Tournament` satisfies it directly. */\nexport interface PhaseInput {\n /** Unix seconds (string or number) the tournament was created on-chain. */\n createdAtOnchain?: string | number | null;\n registrationStartDelay?: number | null;\n registrationEndDelay?: number | null;\n gameStartDelay?: number | null;\n gameEndDelay?: number | null;\n submissionDuration?: number | null;\n /** Fallback structured schedule (used when top-level delays are absent). */\n schedule?: {\n registrationStartDelay: number;\n registrationEndDelay: number;\n gameStartDelay: number;\n gameEndDelay: number;\n submissionDuration: number;\n } | null;\n}\n\n/**\n * Derive the current {@link Phase}. Returns `null` when the on-chain\n * creation time is unknown (can't anchor the schedule).\n *\n * @param t - tournament schedule + `createdAtOnchain`\n * @param nowSeconds - Unix seconds to evaluate at (defaults to wall-clock now).\n * Pass an explicit value for deterministic/testable derivation.\n */\nexport function tournamentPhase(\n t: PhaseInput,\n nowSeconds?: number,\n): Phase | null {\n const createdAt = Number(t.createdAtOnchain ?? NaN);\n if (!Number.isFinite(createdAt)) return null;\n\n const regStartDelay = Number(t.registrationStartDelay ?? t.schedule?.registrationStartDelay ?? 0);\n const regEndDelay = Number(t.registrationEndDelay ?? t.schedule?.registrationEndDelay ?? 0);\n const gameStartDelay = Number(t.gameStartDelay ?? t.schedule?.gameStartDelay ?? 0);\n const gameEndDelay = Number(t.gameEndDelay ?? t.schedule?.gameEndDelay ?? 0);\n const submissionDuration = Number(t.submissionDuration ?? t.schedule?.submissionDuration ?? 0);\n\n const now = nowSeconds ?? Math.floor(Date.now() / 1000);\n\n // Registration exists when either delay is non-zero (contract: has_registration).\n const hasReg = regStartDelay > 0 || regEndDelay > 0;\n const regStart = createdAt + regStartDelay;\n const regEnd = regStart + regEndDelay;\n const gameStart = createdAt + gameStartDelay;\n const gameEnd = gameStart + gameEndDelay;\n const subEnd = gameEnd + submissionDuration;\n\n if (hasReg && now < regStart) return \"scheduled\";\n if (hasReg && now < regEnd) return \"registration\";\n if (now < gameStart) return \"staging\";\n if (now < gameEnd) return \"live\";\n if (now < subEnd) return \"submission\";\n return \"finalized\";\n}\n","import type { Tournament, TournamentListParams, QualificationEntry } from \"../types/tournament.js\";\nimport type { Registration } from \"../types/registration.js\";\nimport type { Prize, RewardClaim, RewardClaimSummary, PrizeAggregation } from \"../types/prize.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport { apiFetch, buildQueryString, extractPagination } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\nimport { tournamentPhase } from \"../phase/index.js\";\n\n/** Normalize tournament: ensure both `id` and `tournamentId` exist */\nfunction normalizeTournament(raw: Record<string, unknown>): Tournament {\n const t = snakeToCamel<Tournament & { id?: string }>(raw);\n // API returns `id`, SDK type uses `tournamentId` — keep both in sync\n const id = t.id ?? t.tournamentId;\n // The protocol-fee share is carried on the entry fee object by the API; lift\n // it to the top level so consumers get it typed (top-level wins if present).\n const protocolFeeShare =\n t.protocolFeeShare ??\n (t.entryFee as { protocolFeeShare?: number } | null)?.protocolFeeShare ??\n null;\n // Derive the lifecycle phase at read time (the API doesn't return it).\n const phase = t.phase ?? tournamentPhase(t);\n return { ...t, id, tournamentId: id, protocolFeeShare, phase };\n}\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch a paginated list of tournaments.\n */\nexport async function getTournaments(\n baseUrl: string,\n params?: TournamentListParams,\n ctx?: ApiContext,\n): Promise<PaginatedResult<Tournament>> {\n const qs = buildQueryString({\n game_address: params?.gameAddress,\n creator: params?.creator,\n phase: params?.phase,\n limit: params?.limit,\n offset: params?.offset,\n sort: params?.sort,\n from_id: params?.fromId,\n exclude_ids: params?.excludeIds?.join(\",\"),\n tournament_ids: params?.tournamentIds?.join(\",\"),\n whitelisted_extensions: params?.whitelistedExtensions?.join(\",\"),\n include_prizes: params?.includePrizeSummary,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => normalizeTournament(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch a single tournament by ID.\n */\nexport async function getTournament(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<Tournament> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/tournaments/${tournamentId}`,\n fetchOpts(ctx),\n );\n return normalizeTournament(result.data);\n}\n\n/**\n * Fetch registrations for a tournament.\n *\n * No `playerAddress` filter: registrations are keyed by token id, and\n * the original registrant goes stale on transfer. Callers wanting \"the\n * current user's registrations\" should resolve their owned token ids via\n * denshokan-sdk's useTokens and pass them as `gameTokenIds`.\n */\nexport async function getTournamentRegistrations(\n baseUrl: string,\n tournamentId: string,\n params?: { gameTokenIds?: string[]; hasSubmitted?: boolean; isBanned?: boolean; limit?: number; offset?: number },\n ctx?: ApiContext,\n): Promise<PaginatedResult<Registration>> {\n const qs = buildQueryString({\n game_token_ids: params?.gameTokenIds?.length ? params.gameTokenIds.join(\",\") : undefined,\n has_submitted: params?.hasSubmitted,\n is_banned: params?.isBanned,\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments/${tournamentId}/registrations${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<Registration>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch prizes for a tournament.\n */\nexport async function getTournamentPrizes(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<Prize[]> {\n const result = await apiFetch<{ data: Record<string, unknown>[] }>(\n `${baseUrl}/tournaments/${tournamentId}/prizes`,\n fetchOpts(ctx),\n );\n return result.data.map((item) => snakeToCamel<Prize>(item));\n}\n\n/**\n * Fetch reward claims for a tournament.\n */\nexport async function getTournamentRewardClaims(\n baseUrl: string,\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ctx?: ApiContext,\n): Promise<PaginatedResult<RewardClaim>> {\n const qs = buildQueryString({\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments/${tournamentId}/reward-claims${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<RewardClaim>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch reward claims summary for a tournament.\n */\nexport async function getTournamentRewardClaimsSummary(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<RewardClaimSummary> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/tournaments/${tournamentId}/reward-claims/summary`,\n fetchOpts(ctx),\n );\n return snakeToCamel<RewardClaimSummary>(result.data);\n}\n\n/**\n * Fetch qualifications for a tournament.\n */\nexport async function getTournamentQualifications(\n baseUrl: string,\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ctx?: ApiContext,\n): Promise<PaginatedResult<QualificationEntry>> {\n const qs = buildQueryString({\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/tournaments/${tournamentId}/qualifications${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<QualificationEntry>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch prize aggregation for a tournament.\n */\nexport async function getTournamentPrizeAggregation(\n baseUrl: string,\n tournamentId: string,\n ctx?: ApiContext,\n): Promise<PrizeAggregation[]> {\n const qs = buildQueryString({ include_aggregation: true });\n const result = await apiFetch<{ data: Record<string, unknown>[] }>(\n `${baseUrl}/tournaments/${tournamentId}/prizes${qs}`,\n fetchOpts(ctx),\n );\n return result.data.map((item) => snakeToCamel<PrizeAggregation>(item));\n}\n","/**\n * Normalize a Starknet address to a 0x-prefixed, 66-character lowercase hex string.\n */\nexport function normalizeAddress(address: string): string {\n const stripped = address.replace(/^0x0*/i, \"\");\n return (\"0x\" + stripped.padStart(64, \"0\")).toLowerCase();\n}\n","import type { Tournament, TournamentListParams } from \"../types/tournament.js\";\nimport type { PlatformStats } from \"../types/activity.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport { apiFetch, buildQueryString, extractPagination } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\nimport { normalizeAddress } from \"../utils/address.js\";\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch tournaments for a specific game.\n */\nexport async function getGameTournaments(\n baseUrl: string,\n gameAddress: string,\n params?: Omit<TournamentListParams, \"gameAddress\">,\n ctx?: ApiContext,\n): Promise<PaginatedResult<Tournament>> {\n const normalized = normalizeAddress(gameAddress);\n const qs = buildQueryString({\n creator: params?.creator,\n phase: params?.phase,\n limit: params?.limit,\n offset: params?.offset,\n });\n const result = await apiFetch<Record<string, unknown>>(`${baseUrl}/games/${normalized}/tournaments${qs}`, fetchOpts(ctx));\n const { total, limit: resLimit, offset: resOffset } = extractPagination(result, { limit: params?.limit, offset: params?.offset });\n return {\n data: (result.data as Record<string, unknown>[]).map((item) => snakeToCamel<Tournament>(item)),\n total,\n limit: resLimit,\n offset: resOffset,\n };\n}\n\n/**\n * Fetch tournament stats for a specific game.\n */\nexport async function getGameStats(\n baseUrl: string,\n gameAddress: string,\n ctx?: ApiContext,\n): Promise<PlatformStats> {\n const normalized = normalizeAddress(gameAddress);\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/games/${normalized}/stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PlatformStats>(result.data);\n}\n","import type { PlatformStats, PrizeStats } from \"../types/activity.js\";\nimport { apiFetch } from \"./base.js\";\nimport type { ApiFetchOptions } from \"./base.js\";\nimport { snakeToCamel } from \"../utils/mappers.js\";\n\ninterface ApiContext {\n retryAttempts?: number;\n retryDelay?: number;\n timeout?: number;\n}\n\nfunction fetchOpts(ctx?: ApiContext): Partial<ApiFetchOptions> {\n return {\n retryAttempts: ctx?.retryAttempts,\n retryDelay: ctx?.retryDelay,\n timeout: ctx?.timeout,\n };\n}\n\n/**\n * Fetch platform-wide activity stats.\n */\nexport async function getActivityStats(\n baseUrl: string,\n ctx?: ApiContext,\n): Promise<PlatformStats> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/activity/stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PlatformStats>(result.data);\n}\n\n/**\n * Fetch platform-wide prize stats.\n */\nexport async function getPrizeStats(\n baseUrl: string,\n ctx?: ApiContext,\n): Promise<PrizeStats> {\n const result = await apiFetch<{ data: Record<string, unknown> }>(\n `${baseUrl}/activity/prize-stats`,\n fetchOpts(ctx),\n );\n return snakeToCamel<PrizeStats>(result.data);\n}\n","import type { WSSubscribeOptions, WSEventHandler, WSEventMessage } from \"../types/websocket.js\";\n\ninterface WSManagerConfig {\n maxReconnectAttempts: number;\n reconnectBaseDelay: number;\n}\n\nconst DEFAULT_WS_CONFIG: WSManagerConfig = {\n maxReconnectAttempts: 10,\n reconnectBaseDelay: 1000,\n};\n\n/**\n * WebSocket manager with auto-reconnect and subscription management.\n */\nexport class WSManager {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly config: WSManagerConfig;\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private subscriptions = new Map<string, { options: WSSubscribeOptions; handler: WSEventHandler }>();\n private nextSubId = 1;\n private connected = false;\n private connectionListeners = new Set<(connected: boolean) => void>();\n\n constructor(wsUrl: string, config?: Partial<WSManagerConfig>) {\n this.wsUrl = wsUrl;\n this.config = { ...DEFAULT_WS_CONFIG, ...config };\n }\n\n /**\n * Open a WebSocket connection. No-op if already connected.\n */\n connect(): void {\n if (this.ws) return;\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.notifyConnectionChange(true);\n // Re-subscribe all active subscriptions\n for (const [, sub] of this.subscriptions) {\n this.sendSubscribe(sub.options);\n }\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data as string) as WSEventMessage;\n if (message.type === \"event\") {\n for (const [, sub] of this.subscriptions) {\n sub.handler(message);\n }\n }\n } catch {\n // Ignore malformed messages\n }\n };\n\n this.ws.onclose = () => {\n this.connected = false;\n this.notifyConnectionChange(false);\n this.ws = null;\n this.attemptReconnect();\n };\n\n this.ws.onerror = () => {\n // onclose will fire after onerror\n };\n } catch {\n this.attemptReconnect();\n }\n }\n\n /**\n * Close the WebSocket connection and stop reconnecting.\n */\n disconnect(): void {\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n if (this.ws) {\n this.ws.onclose = null;\n this.ws.close();\n this.ws = null;\n }\n this.connected = false;\n this.notifyConnectionChange(false);\n this.reconnectAttempts = 0;\n }\n\n /**\n * Subscribe to channels with an optional tournament filter.\n * Returns an unsubscribe function.\n */\n subscribe(options: WSSubscribeOptions, handler: WSEventHandler): () => void {\n const id = String(this.nextSubId++);\n this.subscriptions.set(id, { options, handler });\n\n if (this.connected) {\n this.sendSubscribe(options);\n }\n\n return () => {\n this.subscriptions.delete(id);\n if (this.connected && this.ws) {\n this.ws.send(JSON.stringify({\n type: \"unsubscribe\",\n channels: options.channels,\n }));\n }\n };\n }\n\n /**\n * Register a callback for a single message. Convenience wrapper around subscribe.\n * Returns an unsubscribe function.\n */\n onMessage(callback: WSEventHandler): () => void {\n const id = String(this.nextSubId++);\n // Subscribe to all channels by using a passthrough handler\n this.subscriptions.set(id, {\n options: { channels: [] },\n handler: callback,\n });\n\n return () => {\n this.subscriptions.delete(id);\n };\n }\n\n /**\n * Whether the WebSocket is currently connected.\n */\n get isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Register a listener for connection state changes.\n * Returns an unsubscribe function.\n */\n onConnectionChange(listener: (connected: boolean) => void): () => void {\n this.connectionListeners.add(listener);\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n\n private notifyConnectionChange(isConnected: boolean): void {\n for (const listener of this.connectionListeners) {\n try {\n listener(isConnected);\n } catch {\n // Ignore listener errors\n }\n }\n }\n\n private sendSubscribe(options: WSSubscribeOptions): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n if (options.channels.length === 0) return;\n this.ws.send(JSON.stringify({\n type: \"subscribe\",\n channels: options.channels,\n tournamentIds: options.tournamentIds,\n }));\n }\n\n private attemptReconnect(): void {\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) return;\n if (this.subscriptions.size === 0) return;\n\n const delay = this.config.reconnectBaseDelay * Math.pow(2, this.reconnectAttempts);\n this.reconnectAttempts++;\n\n this.reconnectTimeout = setTimeout(() => {\n this.connect();\n }, Math.min(delay, 30_000));\n }\n}\n","export interface ChainConfig {\n rpcUrl: string;\n apiBaseUrl: string;\n wsUrl: string;\n budokanAddress: string;\n viewerAddress: string;\n}\n\nexport const CHAINS: Record<string, ChainConfig> = {\n mainnet: {\n rpcUrl: \"https://rpc.provable.games/rpc\",\n apiBaseUrl: \"https://budokan-api-production.up.railway.app\",\n wsUrl: \"wss://budokan-api-production.up.railway.app/ws\",\n budokanAddress: \"0x0596ced030e74ebc37f33607f07ecd5a62eff22cdc4ae31fe2d724040c1bdc0b\",\n viewerAddress: \"0x013c8239361fdbd7ec26db2c83f4ff270c5bba83a0bc105b4005b676ff57fdbe\",\n },\n sepolia: {\n rpcUrl: \"https://api.cartridge.gg/x/starknet/sepolia/rpc/v0_10\",\n apiBaseUrl: \"https://budokan-api-sepolia.up.railway.app\",\n wsUrl: \"wss://budokan-api-sepolia.up.railway.app/ws\",\n budokanAddress: \"0x074cc823c382d98e6b8d657aa86776a57d85e1dc2912d54d83a4fef147472683\",\n // Redeployed 2026-06-18 to match the upgraded #264/#269 budokan class —\n // the prior viewer (0x03da56…) was built against the old budokan interface\n // (called the removed `tournament_entries`) and reverted RPC reads.\n viewerAddress: \"0x06b2773d5f1f8bfa5aa3b698fbbaea0472b30af003ea6058330ed52a1acaa283\",\n },\n} as const;\n\nexport function getChainConfig(chain: string): ChainConfig | undefined {\n return CHAINS[chain];\n}\n\n/**\n * Voyager block-explorer base URL for the chain. Used to build\n * shareable links for tx hashes and contracts in chat / Discord / CLI\n * surfaces. Unknown chains fall back to mainnet — Voyager 404s\n * gracefully and the caller can still click the link.\n */\nexport function explorerBaseUrl(chain: string): string {\n if (chain === \"sepolia\") return \"https://sepolia.voyager.online\";\n return \"https://voyager.online\";\n}\n\n/** Voyager URL for a transaction hash. */\nexport function explorerTxUrl(chain: string, txHash: string): string {\n return `${explorerBaseUrl(chain)}/tx/${txHash}`;\n}\n\n/** Voyager URL for a contract / account address. */\nexport function explorerAddressUrl(chain: string, address: string): string {\n return `${explorerBaseUrl(chain)}/contract/${address}`;\n}\n\n/**\n * Canonical budokan.gg URL for a tournament. The `network` query param\n * tells the client which chain to load — important when sharing sepolia\n * tournaments since the site defaults to mainnet.\n */\nexport function tournamentPageUrl(\n chain: string,\n // u64 on-chain — accept bigint/string losslessly (parseTournamentIdFromReceipt\n // returns bigint). number is allowed for convenience.\n tournamentId: string | number | bigint,\n): string {\n return `https://budokan.gg/tournament/${tournamentId}?network=${chain}`;\n}\n","export type ConnectionMode = \"api\" | \"rpc-fallback\" | \"offline\";\n\nexport interface ServiceStatus {\n available: boolean;\n lastChecked: number;\n latency: number | null;\n error: string | null;\n}\n\nexport interface ConnectionStatusState {\n api: ServiceStatus;\n rpc: ServiceStatus;\n mode: ConnectionMode;\n initialCheckComplete: boolean;\n}\n\ntype StatusListener = (status: ConnectionStatusState) => void;\n\nexport interface HealthTimingConfig {\n initialCheckDelay?: number;\n checkInterval?: number;\n checkTimeout?: number;\n}\n\nexport class ConnectionStatus {\n private status: ConnectionStatusState = {\n api: { available: true, lastChecked: 0, latency: null, error: null },\n rpc: { available: true, lastChecked: 0, latency: null, error: null },\n mode: \"api\",\n initialCheckComplete: false,\n };\n\n private listeners = new Set<StatusListener>();\n private checkInterval: ReturnType<typeof setInterval> | null = null;\n private initialCheckTimeout: ReturnType<typeof setTimeout> | null = null;\n private apiUrl: string;\n private rpcUrl: string;\n private readonly initialCheckDelay: number;\n private readonly checkIntervalMs: number;\n private readonly checkTimeoutMs: number;\n\n constructor(apiUrl: string, rpcUrl: string, config?: HealthTimingConfig) {\n this.apiUrl = apiUrl;\n this.rpcUrl = rpcUrl;\n this.initialCheckDelay = Math.max(config?.initialCheckDelay ?? 1_000, 100);\n this.checkIntervalMs = Math.max(config?.checkInterval ?? 30_000, 1_000);\n this.checkTimeoutMs = Math.max(config?.checkTimeout ?? 5_000, 1_000);\n }\n\n getStatus(): ConnectionStatusState {\n return { ...this.status };\n }\n\n get mode(): ConnectionMode {\n return this.status.mode;\n }\n\n subscribe(listener: StatusListener): () => void {\n this.listeners.add(listener);\n listener(this.status);\n return () => { this.listeners.delete(listener); };\n }\n\n startMonitoring(): void {\n if (this.checkInterval) return;\n this.initialCheckTimeout = setTimeout(() => {\n this.performHealthCheck();\n this.checkInterval = setInterval(() => this.performHealthCheck(), this.checkIntervalMs);\n }, this.initialCheckDelay);\n }\n\n stopMonitoring(): void {\n if (this.checkInterval) {\n clearInterval(this.checkInterval);\n this.checkInterval = null;\n }\n if (this.initialCheckTimeout) {\n clearTimeout(this.initialCheckTimeout);\n this.initialCheckTimeout = null;\n }\n }\n\n markApiUnavailable(error?: string): void {\n this.updateStatus({\n api: { ...this.status.api, available: false, lastChecked: Date.now(), error: error || \"Request failed\" },\n });\n }\n\n markRpcUnavailable(error?: string): void {\n this.updateStatus({\n rpc: { ...this.status.rpc, available: false, lastChecked: Date.now(), error: error || \"Request failed\" },\n });\n }\n\n async checkNow(): Promise<void> {\n await this.performHealthCheck();\n }\n\n destroy(): void {\n this.stopMonitoring();\n this.listeners.clear();\n }\n\n private async performHealthCheck(): Promise<void> {\n const [apiResult, rpcResult] = await Promise.all([\n this.checkApi(),\n this.checkRpc(),\n ]);\n this.updateStatus({ api: apiResult, rpc: rpcResult, initialCheckComplete: true });\n }\n\n private async checkApi(): Promise<ServiceStatus> {\n const startTime = Date.now();\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.checkTimeoutMs);\n const response = await fetch(`${this.apiUrl}/health`, { signal: controller.signal });\n clearTimeout(timeoutId);\n const latency = Date.now() - startTime;\n if (!response.ok) {\n return { available: false, lastChecked: Date.now(), latency, error: `HTTP ${response.status}` };\n }\n const data = await response.json() as Record<string, unknown>;\n const isAvailable = data.status === \"healthy\" || data.status === \"degraded\";\n return { available: isAvailable, lastChecked: Date.now(), latency, error: isAvailable ? null : `API status: ${data.status}` };\n } catch (error) {\n return { available: false, lastChecked: Date.now(), latency: null, error: error instanceof Error ? error.message : \"Network error\" };\n }\n }\n\n private async checkRpc(): Promise<ServiceStatus> {\n const startTime = Date.now();\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.checkTimeoutMs);\n const response = await fetch(this.rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", method: \"starknet_chainId\", params: [], id: 1 }),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n const latency = Date.now() - startTime;\n if (!response.ok) {\n return { available: false, lastChecked: Date.now(), latency, error: `HTTP ${response.status}` };\n }\n const data = await response.json() as Record<string, unknown>;\n const isHealthy = data.result !== undefined && !data.error;\n return { available: isHealthy, lastChecked: Date.now(), latency, error: isHealthy ? null : \"RPC error\" };\n } catch (error) {\n return { available: false, lastChecked: Date.now(), latency: null, error: error instanceof Error ? error.message : \"Network error\" };\n }\n }\n\n private updateStatus(partial: Partial<ConnectionStatusState>): void {\n const newStatus = { ...this.status, ...partial };\n\n if (newStatus.api.available) {\n newStatus.mode = \"api\";\n } else if (newStatus.rpc.available) {\n newStatus.mode = \"rpc-fallback\";\n } else {\n newStatus.mode = \"offline\";\n }\n\n const changed =\n this.status.api.available !== newStatus.api.available ||\n this.status.rpc.available !== newStatus.rpc.available ||\n this.status.mode !== newStatus.mode ||\n this.status.initialCheckComplete !== newStatus.initialCheckComplete;\n\n this.status = newStatus;\n\n if (changed) {\n this.listeners.forEach((listener) => {\n try { listener(this.status); } catch { /* ignore */ }\n });\n }\n }\n}\n","import type { ConnectionStatus } from \"./health.js\";\nimport { DataSourceError } from \"../errors/index.js\";\n\nexport async function withFallback<T>(\n primary: () => Promise<T>,\n fallback: () => Promise<T>,\n health?: ConnectionStatus,\n): Promise<T> {\n // If health monitoring shows primary source is down, skip it\n if (health) {\n const mode = health.mode;\n if (mode === \"rpc-fallback\") {\n // API is known-down, go straight to RPC fallback\n try {\n return await fallback();\n } catch (fallbackError) {\n throw fallbackError;\n }\n }\n\n if (mode === \"offline\") {\n // Both are known-down, still try both in order\n }\n }\n\n let primaryError: Error;\n try {\n return await primary();\n } catch (error) {\n primaryError = error as Error;\n // Report failure to health service\n if (health) {\n health.markApiUnavailable(primaryError.message);\n }\n }\n\n try {\n return await fallback();\n } catch (fallbackError) {\n if (health) {\n health.markRpcUnavailable((fallbackError as Error).message);\n }\n throw new DataSourceError(primaryError, fallbackError as Error);\n }\n}\n","import type { RpcProvider, Contract, Abi } from \"starknet\";\n\nlet starknetModule: typeof import(\"starknet\") | null = null;\n\nasync function getStarknet(): Promise<typeof import(\"starknet\")> {\n if (!starknetModule) {\n starknetModule = await import(\"starknet\");\n }\n return starknetModule;\n}\n\nexport async function createProvider(\n rpcUrl: string,\n headers?: Record<string, string>,\n): Promise<RpcProvider> {\n const { RpcProvider: StarknetRpcProvider } = await getStarknet();\n const provider = new StarknetRpcProvider({\n nodeUrl: rpcUrl,\n ...(headers && { headers }),\n });\n return provider;\n}\n\nexport async function createContract(\n abi: Abi,\n address: string,\n provider: RpcProvider,\n): Promise<Contract> {\n // Handle case where ABI might be wrapped in a default export\n let resolvedAbi: Abi = abi;\n if (abi && !Array.isArray(abi) && typeof abi === \"object\" && \"default\" in abi) {\n resolvedAbi = (abi as { default: Abi }).default;\n }\n\n const starknet = await getStarknet();\n\n return new starknet.Contract({ abi: resolvedAbi, address, providerOrAccount: provider });\n}\n","import type { Contract } from \"starknet\";\nimport { CairoCustomEnum } from \"starknet\";\nimport type { Tournament } from \"../types/tournament.js\";\nimport type { EntryRequirement, Distribution } from \"@provable-games/metagame-sdk\";\nimport type { LeaderboardEntry } from \"../types/leaderboard.js\";\nimport type { Registration } from \"../types/registration.js\";\nimport type { Prize } from \"../types/prize.js\";\nimport type { PaginatedResult } from \"../types/common.js\";\nimport type { Phase } from \"../types/tournament.js\";\nimport { RpcError } from \"../errors/index.js\";\nimport { tournamentPhase } from \"../phase/index.js\";\nimport { num } from \"starknet\";\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\nfunction wrapRpcCall<T>(fn: () => Promise<T>, contractAddress?: string): Promise<T> {\n return fn().catch((error: unknown) => {\n throw new RpcError(\n error instanceof Error ? error.message : \"RPC call failed\",\n contractAddress,\n );\n });\n}\n\nfunction decodeShortString(value: unknown): string {\n if (!value) return \"\";\n const hex = num.toHex(value as bigint);\n if (hex === \"0x0\") return \"\";\n const hexStr = hex.slice(2);\n let result = \"\";\n for (let i = 0; i < hexStr.length; i += 2) {\n const charCode = parseInt(hexStr.slice(i, i + 2), 16);\n if (charCode === 0) break;\n result += String.fromCharCode(charCode);\n }\n return result;\n}\n\nfunction decodeByteArray(value: unknown): string {\n if (!value) return \"\";\n // ByteArray from Cairo is serialized as { data: felt252[], pending_word: felt252, pending_word_len: u32 }\n const obj = value as Record<string, unknown>;\n const data = obj.data as unknown[] | undefined;\n const pendingWord = obj.pending_word;\n const pendingWordLen = Number(obj.pending_word_len ?? 0);\n\n let result = \"\";\n\n // Each data element is a 31-byte chunk encoded as felt252\n if (data) {\n for (const chunk of data) {\n const hex = num.toHex(chunk as bigint).slice(2).padStart(62, \"0\");\n for (let i = 0; i < 62; i += 2) {\n const charCode = parseInt(hex.slice(i, i + 2), 16);\n if (charCode !== 0) result += String.fromCharCode(charCode);\n }\n }\n }\n\n // Pending word contains remaining bytes (< 31)\n if (pendingWord && pendingWordLen > 0) {\n const hex = num.toHex(pendingWord as bigint).slice(2).padStart(pendingWordLen * 2, \"0\");\n for (let i = 0; i < pendingWordLen * 2; i += 2) {\n const charCode = parseInt(hex.slice(i, i + 2), 16);\n if (charCode !== 0) result += String.fromCharCode(charCode);\n }\n }\n\n return result;\n}\n\n/** All Phase variant names for CairoCustomEnum */\nconst PHASE_VARIANTS = [\"Scheduled\", \"Registration\", \"Staging\", \"Live\", \"Submission\", \"Finalized\"] as const;\n\nconst PHASE_NAME_MAP: Record<Phase, string> = {\n scheduled: \"Scheduled\",\n registration: \"Registration\",\n staging: \"Staging\",\n live: \"Live\",\n submission: \"Submission\",\n finalized: \"Finalized\",\n};\n\n/** Convert SDK Phase string to Cairo enum argument for RPC calls */\nfunction phaseToRpcArg(phase: Phase): CairoCustomEnum {\n const activeVariant = PHASE_NAME_MAP[phase];\n const variants: Record<string, unknown> = {};\n for (const v of PHASE_VARIANTS) {\n variants[v] = v === activeVariant ? {} : undefined;\n }\n return new CairoCustomEnum(variants);\n}\n\n// =========================================================================\n// Parsers — raw on-chain structs → SDK types\n// =========================================================================\n\nfunction parseTournament(\n raw: unknown,\n entryCount: number,\n protocolFeeShare: number | null = null,\n): Tournament {\n const obj = raw as Record<string, unknown>;\n const id = String(obj.id ?? \"0\");\n const createdAt = Number(obj.created_at ?? 0);\n const createdBy = num.toHex(obj.created_by as bigint);\n const creatorTokenId = obj.creator_token_id ? num.toHex(obj.creator_token_id as bigint) : null;\n\n // Metadata\n const metadata = obj.metadata as Record<string, unknown> | undefined;\n const name = metadata ? decodeShortString(metadata.name) : \"\";\n const description = metadata ? decodeByteArray(metadata.description) : \"\";\n\n // Schedule\n const sched = obj.schedule as Record<string, unknown> | undefined;\n const registrationStartDelay = Number(sched?.registration_start_delay ?? 0);\n const registrationEndDelay = Number(sched?.registration_end_delay ?? 0);\n const gameStartDelay = Number(sched?.game_start_delay ?? 0);\n const gameEndDelay = Number(sched?.game_end_delay ?? 0);\n const submissionDuration = Number(sched?.submission_duration ?? 0);\n\n // Compute absolute timestamps (matching contract: each delay is relative to its anchor)\n const createdAtStr = String(createdAt);\n const regStart = createdAt + registrationStartDelay;\n const regEnd = regStart + registrationEndDelay;\n const gameStart = createdAt + gameStartDelay;\n const gameEnd = gameStart + gameEndDelay;\n const subEnd = gameEnd + submissionDuration;\n const registrationStartTime = String(regStart);\n const registrationEndTime = String(regEnd);\n const gameStartTime = String(gameStart);\n const gameEndTime = String(gameEnd);\n const submissionEndTime = String(subEnd);\n\n // GameConfig\n const gc = obj.game_config as Record<string, unknown> | undefined;\n const gameAddress = gc ? num.toHex(gc.game_address as bigint) : \"\";\n const settingsId = Number(gc?.settings_id ?? 0);\n const soulbound = Boolean(gc?.soulbound);\n const paymaster = Boolean(gc?.paymaster);\n const clientUrl = gc?.client_url ? decodeOptionalByteArray(gc.client_url) : null;\n const renderer = gc?.renderer ? parseOptionalAddress(gc.renderer) : null;\n\n // LeaderboardConfig\n const lc = obj.leaderboard_config as Record<string, unknown> | undefined;\n const ascending = Boolean(lc?.ascending);\n const gameMustBeOver = Boolean(lc?.game_must_be_over);\n\n // entry_fee is Option<EntryFeeKind>, where EntryFeeKind is a sum type\n // { BuiltIn: EntryFee, Extension: ExtensionConfig }. Unwrap the Option,\n // then the BuiltIn variant. Extension entry fees aren't representable in\n // the flat Tournament.entryFee shape, so they map to null (same as\n // extension prizes in parsePrize).\n const entryFeeKind = parseOption(obj.entry_fee) as\n | Record<string, unknown>\n | null;\n let entryFeeToken: string | null = null;\n let entryFeeAmount: string | null = null;\n let entryFee: Tournament[\"entryFee\"] = null;\n let entryFeeKindTag: Tournament[\"entryFeeKind\"] = null;\n let entryFeeExtension: Tournament[\"entryFeeExtension\"] = null;\n if (entryFeeKind) {\n const variantBag = (entryFeeKind.variant ?? entryFeeKind) as Record<\n string,\n unknown\n >;\n const ef = variantBag.BuiltIn as Record<string, unknown> | undefined;\n const ext = variantBag.Extension as Record<string, unknown> | undefined;\n if (ef) {\n entryFeeKindTag = \"builtin\";\n entryFeeToken = num.toHex(ef.token_address as bigint);\n entryFeeAmount = String(ef.amount ?? \"0\");\n entryFee = {\n tokenAddress: entryFeeToken,\n amount: entryFeeAmount,\n tournamentCreatorShare: Number(ef.tournament_creator_share ?? 0),\n gameCreatorShare: Number(ef.game_creator_share ?? 0),\n refundShare: Number(ef.refund_share ?? 0),\n distribution: (ef.distribution as Distribution) ?? null,\n distributionCount: Number(ef.distribution_count ?? 0),\n };\n } else if (ext) {\n // EntryFeeKind::Extension { address, config } — an external fee\n // extension. Built-in fee fields stay null; surfaced distinctly so\n // callers don't mistake it for a free tournament.\n entryFeeKindTag = \"extension\";\n entryFeeExtension = {\n address: num.toHex(ext.address as bigint),\n config: Array.isArray(ext.config)\n ? (ext.config as unknown[]).map((x) => num.toHex(x as bigint))\n : [],\n };\n }\n }\n\n // EntryRequirement (Option)\n const entryRequirement = parseOption(obj.entry_requirement) as EntryRequirement | null;\n const hasEntryRequirement = entryRequirement !== null;\n\n return {\n id,\n tournamentId: id,\n gameAddress,\n createdAt: new Date(createdAt * 1000).toISOString(),\n createdBy,\n creatorTokenId,\n name,\n description,\n registrationStartDelay,\n registrationEndDelay,\n gameStartDelay,\n gameEndDelay,\n submissionDuration,\n createdAtOnchain: createdAtStr,\n registrationStartTime,\n registrationEndTime,\n gameStartTime,\n gameEndTime,\n submissionEndTime,\n settingsId,\n soulbound,\n paymaster,\n clientUrl,\n renderer,\n leaderboardAscending: ascending,\n leaderboardGameMustBeOver: gameMustBeOver,\n entryFeeToken,\n entryFeeAmount,\n // Protocol-fee bps snapshot, surfaced by the viewer's TournamentFullState.\n protocolFeeShare,\n hasEntryRequirement,\n schedule: {\n registrationStartDelay,\n registrationEndDelay,\n gameStartDelay,\n gameEndDelay,\n submissionDuration,\n },\n gameConfig: {\n gameAddress,\n settingsId,\n soulbound,\n paymaster,\n clientUrl,\n renderer,\n },\n entryFee,\n entryFeeKind: entryFeeKindTag,\n entryFeeExtension,\n entryRequirement,\n leaderboardConfig: { ascending, gameMustBeOver },\n phase: tournamentPhase({\n createdAtOnchain: createdAtStr,\n registrationStartDelay,\n registrationEndDelay,\n gameStartDelay,\n gameEndDelay,\n submissionDuration,\n }),\n entryCount,\n prizeCount: 0, // Not available from viewer\n submissionCount: 0, // Not available from viewer\n metadata: null,\n };\n}\n\nfunction parseLeaderboardEntry(raw: unknown): LeaderboardEntry {\n const obj = raw as Record<string, unknown>;\n return {\n position: Number(obj.position ?? 0),\n tokenId: num.toHex(obj.token_id as bigint),\n };\n}\n\nfunction parseRegistration(raw: unknown, tournamentId: string): Registration {\n const obj = raw as Record<string, unknown>;\n return {\n tournamentId,\n gameTokenId: num.toHex(obj.game_token_id as bigint),\n gameAddress: \"\", // Not in on-chain struct\n entryNumber: Number(obj.entry_id ?? 0),\n hasSubmitted: Boolean(obj.has_submitted),\n isBanned: Boolean(obj.is_banned),\n };\n}\n\nfunction parsePrize(raw: unknown): Prize {\n const record = raw as Record<string, unknown>;\n\n // Unwrap PrizeRecord -> Prize sum type. starknet.js may expose the variant\n // via `activeVariant()` + `variant`, or as a flat record keyed by name.\n // Throw (rather than drop) on malformed/unknown shapes so a changed RPC\n // response surfaces as an error instead of a silently-truncated prize list.\n const prizeEnum = record.prize as Record<string, unknown> | undefined;\n if (!prizeEnum) {\n throw new Error(`PrizeRecord missing prize field: ${JSON.stringify(raw)}`);\n }\n const activePrize =\n typeof prizeEnum.activeVariant === \"function\"\n ? (prizeEnum.activeVariant as () => string)()\n : prizeEnum.Token !== undefined\n ? \"Token\"\n : prizeEnum.Extension !== undefined\n ? \"Extension\"\n : null;\n const prizeVariantBag = (prizeEnum.variant ?? prizeEnum) as Record<string, unknown>;\n\n // Prize::Extension { address: ContractAddress, config: Span<felt252> } —\n // an external IPrizeExtension prize. Modelled with tokenType \"extension\"\n // and the token fields left null.\n if (activePrize === \"Extension\") {\n const ext = prizeVariantBag.Extension as Record<string, unknown> | undefined;\n return {\n prizeId: String(record.id ?? \"0\"),\n tournamentId: String(record.context_id ?? \"0\"),\n payoutPosition: 0,\n tokenAddress: null,\n tokenType: \"extension\",\n amount: null,\n tokenId: null,\n distributionType: null,\n distributionWeight: null,\n distributionShares: null,\n distributionCount: null,\n sponsorAddress: num.toHex(record.sponsor_address as bigint),\n extensionAddress:\n ext?.address != null ? num.toHex(ext.address as bigint) : null,\n extensionConfig: Array.isArray(ext?.config)\n ? (ext!.config as unknown[]).map((x) => num.toHex(x as bigint))\n : null,\n };\n }\n if (activePrize !== \"Token\") {\n throw new Error(`Unrecognised Prize variant: ${JSON.stringify(prizeEnum)}`);\n }\n\n const tokenPayload = prizeVariantBag.Token as Record<string, unknown> | undefined;\n if (!tokenPayload) {\n throw new Error(`Prize::Token missing payload: ${JSON.stringify(prizeEnum)}`);\n }\n\n const tokenTypeData = tokenPayload.token_type as Record<string, unknown> | undefined;\n\n // TokenTypeData is a Cairo enum: { erc20: ERC20Data } or { erc721: ERC721Data }\n let tokenType: \"erc20\" | \"erc721\" = \"erc20\";\n let amount: string | null = null;\n let tokenId: string | null = null;\n let distributionType: string | null = null;\n let distributionWeight: number | null = null;\n let distributionShares: number[] | null = null;\n let distributionCount: number | null = null;\n // NOTE: the `tournament_prizes` PrizeRecord does not carry the prize's\n // leaderboard position (it's assigned at add_prize time and stored\n // elsewhere), so the RPC path can't populate it — defaults to 0. The API\n // path hydrates the real position. Pre-existing viewer limitation,\n // independent of the #269 migration.\n let payoutPosition = 0;\n\n if (tokenTypeData) {\n // starknet.js v9 returns CairoCustomEnum with the active variant as a\n // non-undefined property. Check activeVariant() or the property value.\n const activeVariant = typeof tokenTypeData.activeVariant === \"function\"\n ? (tokenTypeData.activeVariant as () => string)()\n : tokenTypeData.erc20 !== undefined ? \"erc20\"\n : tokenTypeData.erc721 !== undefined ? \"erc721\"\n : null;\n\n // starknet.js v9 nests data under .variant.{name} or directly under .{name}\n const variantData = (tokenTypeData as Record<string, unknown>).variant as Record<string, unknown> | undefined;\n const unwrap = (name: string) =>\n (variantData?.[name] ?? tokenTypeData[name]) as Record<string, unknown> | undefined;\n\n if (activeVariant === \"erc20\") {\n const erc20 = unwrap(\"erc20\");\n tokenType = \"erc20\";\n amount = String(erc20?.amount ?? \"0\");\n\n // distribution is Option<Distribution> — unwrap the Option then the enum\n const distOption = erc20?.distribution as Record<string, unknown> | undefined;\n const distInner = distOption?.Some as Record<string, unknown> | undefined;\n if (distInner) {\n // Distribution enum: { variant: { Linear: n } } or { Linear: n }.\n // Custom carries a Span<u16>; the scalar variants carry a u32.\n const distVariant = (distInner.variant ?? distInner) as Record<string, unknown>;\n const distType = Object.keys(distVariant).find((k) => distVariant[k] !== undefined);\n if (distType) {\n distributionType = distType.toLowerCase();\n const distValue = distVariant[distType];\n if (distributionType === \"custom\") {\n distributionShares = Array.isArray(distValue)\n ? (distValue as unknown[]).map((v) => Number(v))\n : null;\n } else {\n distributionWeight = distValue != null ? Number(distValue) : null;\n }\n }\n }\n\n // distribution_count is Option<u32>\n const countOption = erc20?.distribution_count as Record<string, unknown> | undefined;\n distributionCount = countOption?.Some != null ? Number(countOption.Some) : null;\n } else if (activeVariant === \"erc721\") {\n const erc721 = unwrap(\"erc721\");\n tokenType = \"erc721\";\n tokenId = String(erc721?.id ?? \"0\");\n }\n }\n\n return {\n prizeId: String(record.id ?? \"0\"),\n tournamentId: String(record.context_id ?? \"0\"),\n payoutPosition,\n tokenAddress: num.toHex(tokenPayload.token_address as bigint),\n tokenType,\n amount,\n tokenId,\n distributionType,\n distributionWeight,\n distributionShares,\n distributionCount,\n sponsorAddress: num.toHex(record.sponsor_address as bigint),\n extensionAddress: null,\n extensionConfig: null,\n };\n}\n\n/** Unwrap a Cairo Option — starknet.js may return { Some: value } / { None: {} } or just the value */\nfunction parseOption(raw: unknown): unknown | null {\n if (raw === undefined || raw === null) return null;\n const obj = raw as Record<string, unknown>;\n if (\"Some\" in obj) return obj.Some;\n if (\"None\" in obj) return null;\n // Some starknet.js versions flatten the option\n return raw;\n}\n\nfunction decodeOptionalByteArray(raw: unknown): string | null {\n const inner = parseOption(raw);\n if (!inner) return null;\n return decodeByteArray(inner);\n}\n\nfunction parseOptionalAddress(raw: unknown): string | null {\n const inner = parseOption(raw);\n if (!inner) return null;\n const hex = num.toHex(inner as bigint);\n return hex === \"0x0\" ? null : hex;\n}\n\n// =========================================================================\n// Viewer functions\n// =========================================================================\n\ninterface TournamentFilterResult {\n tournamentIds: string[];\n total: number;\n}\n\nfunction parseFilterResult(raw: unknown): TournamentFilterResult {\n const obj = raw as Record<string, unknown>;\n const ids = (obj.tournament_ids as unknown[])?.map((v) => String(v)) ?? [];\n const total = Number(obj.total ?? 0);\n return { tournamentIds: ids, total };\n}\n\nfunction parseTournamentFullState(raw: unknown): Tournament {\n const obj = raw as Record<string, unknown>;\n const entryCount = Number(obj.entry_count ?? 0);\n const protocolFeeShare =\n obj.protocol_fee_bps != null ? Number(obj.protocol_fee_bps) : null;\n return parseTournament(obj.tournament, entryCount, protocolFeeShare);\n}\n\n// --- Tournament listing ---\n\nexport async function viewerTournaments(\n contract: Contract,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments\", [offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\nexport async function viewerTournamentsByGame(\n contract: Contract,\n gameAddress: string,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_game\", [gameAddress, offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\nexport async function viewerTournamentsByCreator(\n contract: Contract,\n creator: string,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_creator\", [creator, offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\n/**\n * Map a single SDK phase to the group of on-chain phases it represents.\n * \"scheduled\" includes Scheduled + Registration + Staging (all pre-game).\n * \"live\" includes Live + Submission (active gameplay).\n * \"finalized\" stays as-is.\n */\nconst PHASE_GROUPS: Record<Phase, Phase[]> = {\n scheduled: [\"scheduled\", \"registration\", \"staging\"],\n registration: [\"registration\"],\n staging: [\"staging\"],\n live: [\"live\", \"submission\"],\n submission: [\"submission\"],\n finalized: [\"finalized\"],\n};\n\nexport async function viewerTournamentsByPhase(\n contract: Contract,\n phase: Phase,\n offset: number,\n limit: number,\n): Promise<TournamentFilterResult> {\n const phases = PHASE_GROUPS[phase];\n if (phases.length === 1) {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_phase\", [phaseToRpcArg(phase), offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n }\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_by_phases\", [phases.map(phaseToRpcArg), offset, limit]);\n return parseFilterResult(result);\n }, contract.address);\n}\n\n// --- Tournament detail ---\n\nexport async function viewerTournamentDetail(\n contract: Contract,\n tournamentId: string,\n): Promise<Tournament | null> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_detail\", [tournamentId]);\n const tournament = parseTournamentFullState(result);\n // Viewer returns a zero-filled struct for non-existent tournaments\n if (!tournament.gameAddress || tournament.gameAddress === \"0x0\") return null;\n return tournament;\n }, contract.address);\n}\n\nexport async function viewerTournamentsBatch(\n contract: Contract,\n tournamentIds: string[],\n): Promise<Tournament[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournaments_batch\", [tournamentIds]);\n return (result as unknown[]).map(parseTournamentFullState);\n }, contract.address);\n}\n\n// --- Registrations ---\n\nexport async function viewerRegistrations(\n contract: Contract,\n tournamentId: string,\n offset: number,\n limit: number,\n): Promise<PaginatedResult<Registration>> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_registrations\", [tournamentId, offset, limit]);\n const obj = result as Record<string, unknown>;\n const entries = (obj.entries as unknown[]) ?? [];\n const total = Number(obj.total ?? 0);\n return {\n data: entries.map((e) => parseRegistration(e, tournamentId)),\n total,\n limit,\n offset,\n };\n }, contract.address);\n}\n\nexport async function viewerRegistrationsByTokenIds(\n contract: Contract,\n tournamentId: string,\n tokenIds: string[],\n offset: number,\n limit: number,\n): Promise<PaginatedResult<Registration>> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_registrations_by_token_ids\", [tournamentId, tokenIds, offset, limit]);\n const obj = result as Record<string, unknown>;\n const entries = (obj.entries as unknown[]) ?? [];\n const total = Number(obj.total ?? 0);\n return {\n data: entries.map((e) => parseRegistration(e, tournamentId)),\n total,\n limit,\n offset,\n };\n }, contract.address);\n}\n\n// --- Leaderboard ---\n\nexport async function viewerLeaderboard(\n contract: Contract,\n tournamentId: string,\n offset: number,\n limit: number,\n): Promise<LeaderboardEntry[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"leaderboard\", [tournamentId, offset, limit]);\n return (result as unknown[]).map(parseLeaderboardEntry);\n }, contract.address);\n}\n\n// --- Prizes ---\n\nexport async function viewerPrizes(\n contract: Contract,\n tournamentId: string,\n): Promise<Prize[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_prizes\", [tournamentId]);\n return (result as unknown[]).map(parsePrize);\n }, contract.address);\n}\n\n// --- Reward Claims ---\n\nimport type { RewardClaimKind } from \"../types/prize.js\";\n\n/**\n * Flat reward-claim shape returned by the on-chain viewer's\n * `tournament_reward_claims` view, after translating the Cairo\n * `RewardType` enum (deserialized as a CairoCustomEnum by starknet.js)\n * into the structured fields the API also exposes. Mirrors the\n * `RewardClaim` SDK type so the RPC and API paths are interchangeable.\n */\nexport interface ViewerRewardClaim {\n claimKind: RewardClaimKind;\n prizeId: string | null;\n payoutIndex: number | null;\n position: number | null;\n refundTokenId: string | null;\n extensionTokenId: string | null;\n extensionParams: string[] | null;\n claimed: boolean;\n}\n\nexport interface ViewerRewardClaimResult {\n claims: ViewerRewardClaim[];\n total: number;\n totalClaimed: number;\n totalUnclaimed: number;\n}\n\n/**\n * Translate the on-chain `RewardType` CairoCustomEnum (as returned by\n * starknet.js for the `tournament_reward_claims` view) into the same\n * structured fields the API exposes. Both starknet.js shapes are accepted —\n * one with `activeVariant()` and a `variant` bag, one with a flat record\n * keyed by variant name — depending on the contract ABI codegen.\n */\ntype TranslatedRewardClaim = {\n claimKind: RewardClaimKind;\n prizeId: string | null;\n payoutIndex: number | null;\n position: number | null;\n refundTokenId: string | null;\n extensionTokenId: string | null;\n extensionParams: string[] | null;\n};\n\n// All fields default to null; each variant fills only what it carries.\nfunction rewardClaim(\n partial: Partial<TranslatedRewardClaim> & { claimKind: RewardClaimKind },\n): TranslatedRewardClaim {\n return {\n prizeId: null,\n payoutIndex: null,\n position: null,\n refundTokenId: null,\n extensionTokenId: null,\n extensionParams: null,\n ...partial,\n };\n}\n\n// Span<felt252> → hex strings; tolerates the array shape starknet.js returns.\nfunction spanToHex(v: unknown): string[] {\n return Array.isArray(v) ? v.map((x) => num.toHex(x as bigint)) : [];\n}\n\nfunction translateCairoRewardType(rewardType: unknown): TranslatedRewardClaim {\n if (!rewardType || typeof rewardType !== \"object\") {\n throw new Error(`Unexpected RewardType payload: ${JSON.stringify(rewardType)}`);\n }\n const rt = rewardType as Record<string, any>;\n const outer =\n typeof rt.activeVariant === \"function\" ? rt.activeVariant() : null;\n const innerBag = (typeof rt.activeVariant === \"function\" ? rt.variant : rt) as Record<string, any>;\n\n if (outer === \"Prize\" || innerBag.Prize !== undefined) {\n // PrizeClaim { Token: PrizeType, Extension: ExtensionPrizeClaim }.\n const prizeClaim = innerBag.Prize;\n const pcBag = (typeof prizeClaim?.activeVariant === \"function\"\n ? prizeClaim.variant\n : prizeClaim) as Record<string, any>;\n\n // PrizeClaim::Extension { prize_id: u64, token_id: Option<felt252>,\n // payout_params: Span<felt252> }.\n if (pcBag?.Token === undefined && pcBag?.Extension !== undefined) {\n const ext = pcBag.Extension as Record<string, any>;\n const tokenId = parseOption(ext.token_id);\n return rewardClaim({\n claimKind: \"prize_extension\",\n prizeId: BigInt(ext.prize_id ?? 0).toString(),\n extensionTokenId: tokenId != null ? num.toHex(tokenId as bigint) : null,\n extensionParams: spanToHex(ext.payout_params),\n });\n }\n\n // PrizeClaim::Token(PrizeType). Unwrap Token; fall back to the older flat shape.\n const prize = pcBag?.Token ?? prizeClaim;\n const subVariant = typeof prize?.activeVariant === \"function\" ? prize.activeVariant() : null;\n const subBag = (typeof prize?.activeVariant === \"function\" ? prize.variant : prize) as Record<string, any>;\n\n if (subVariant === \"Single\" || subBag?.Single !== undefined) {\n return rewardClaim({\n claimKind: \"prize_single\",\n prizeId: BigInt(subBag.Single).toString(),\n });\n }\n if (subVariant === \"Distributed\" || subBag?.Distributed !== undefined) {\n const distributed = subBag.Distributed;\n const prizeId = distributed?.[\"0\"] ?? distributed?.[0];\n const payoutIndex = distributed?.[\"1\"] ?? distributed?.[1];\n return rewardClaim({\n claimKind: \"prize_distributed\",\n prizeId: BigInt(prizeId).toString(),\n payoutIndex: Number(payoutIndex),\n });\n }\n }\n\n if (outer === \"EntryFee\" || innerBag.EntryFee !== undefined) {\n // EntryFeeClaim { Token: EntryFeeRewardType, Extension: ExtensionEntryFeeClaim }.\n const entryFeeClaim = innerBag.EntryFee;\n const efBag = (typeof entryFeeClaim?.activeVariant === \"function\"\n ? entryFeeClaim.variant\n : entryFeeClaim) as Record<string, any>;\n\n // EntryFeeClaim::Extension { token_id: Option<felt252>, claim_params: Span<felt252> }.\n if (efBag?.Token === undefined && efBag?.Extension !== undefined) {\n const ext = efBag.Extension as Record<string, any>;\n const tokenId = parseOption(ext.token_id);\n return rewardClaim({\n claimKind: \"entry_fee_extension\",\n extensionTokenId: tokenId != null ? num.toHex(tokenId as bigint) : null,\n extensionParams: spanToHex(ext.claim_params),\n });\n }\n\n // EntryFeeClaim::Token(EntryFeeRewardType). Unwrap Token; fall back to flat.\n const entryFee = efBag?.Token ?? entryFeeClaim;\n const subVariant =\n typeof entryFee?.activeVariant === \"function\" ? entryFee.activeVariant() : null;\n const subBag = (typeof entryFee?.activeVariant === \"function\" ? entryFee.variant : entryFee) as Record<string, any>;\n\n if (subVariant === \"Position\" || subBag?.Position !== undefined) {\n return rewardClaim({\n claimKind: \"entry_fee_position\",\n position: Number(subBag.Position),\n });\n }\n if (subVariant === \"TournamentCreator\" || subBag?.TournamentCreator !== undefined) {\n return rewardClaim({ claimKind: \"entry_fee_tournament_creator\" });\n }\n if (subVariant === \"GameCreator\" || subBag?.GameCreator !== undefined) {\n return rewardClaim({ claimKind: \"entry_fee_game_creator\" });\n }\n if (subVariant === \"ProtocolFee\" || subBag?.ProtocolFee !== undefined) {\n return rewardClaim({ claimKind: \"entry_fee_protocol_fee\" });\n }\n if (subVariant === \"Refund\" || subBag?.Refund !== undefined) {\n return rewardClaim({\n claimKind: \"entry_fee_refund\",\n refundTokenId: `0x${BigInt(subBag.Refund).toString(16)}`,\n });\n }\n }\n\n throw new Error(\n `Unrecognised on-chain RewardType variant: ${JSON.stringify(rewardType)}`,\n );\n}\n\nexport async function viewerRewardClaims(\n contract: Contract,\n tournamentId: string,\n offset: number,\n limit: number,\n): Promise<ViewerRewardClaimResult> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_reward_claims\", [tournamentId, offset, limit]);\n const obj = result as Record<string, unknown>;\n const claims: ViewerRewardClaim[] = ((obj.claims as unknown[]) ?? []).map(\n (raw) => {\n const claim = raw as Record<string, unknown>;\n return {\n ...translateCairoRewardType(claim.reward_type),\n claimed: Boolean(claim.claimed),\n };\n },\n );\n return {\n claims,\n total: Number(obj.total ?? 0),\n totalClaimed: Number(obj.total_claimed ?? 0),\n totalUnclaimed: Number(obj.total_unclaimed ?? 0),\n };\n }, contract.address);\n}\n\n","[\n {\n \"type\": \"impl\",\n \"name\": \"UpgradeableImpl\",\n \"interface_name\": \"openzeppelin_interfaces::upgrades::IUpgradeable\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::upgrades::IUpgradeable\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"upgrade\",\n \"inputs\": [\n {\n \"name\": \"new_class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"BudokanViewerImpl\",\n \"interface_name\": \"budokan_interfaces::viewer::IBudokanViewer\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::TournamentFilterResult\",\n \"members\": [\n {\n \"name\": \"tournament_ids\",\n \"type\": \"core::array::Array::<core::integer::u64>\"\n },\n {\n \"name\": \"total\",\n \"type\": \"core::integer::u64\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::Phase\",\n \"variants\": [\n {\n \"name\": \"Scheduled\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Registration\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Staging\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Live\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Submission\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Finalized\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::byte_array::ByteArray\",\n \"members\": [\n {\n \"name\": \"data\",\n \"type\": \"core::array::Array::<core::bytes_31::bytes31>\"\n },\n {\n \"name\": \"pending_word\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"pending_word_len\",\n \"type\": \"core::internal::bounded_int::BoundedInt::<0, 30>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Metadata\",\n \"members\": [\n {\n \"name\": \"name\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"description\",\n \"type\": \"core::byte_array::ByteArray\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Schedule\",\n \"members\": [\n {\n \"name\": \"registration_start_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"registration_end_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_start_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_end_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"submission_duration\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::bool\",\n \"variants\": [\n {\n \"name\": \"False\",\n \"type\": \"()\"\n },\n {\n \"name\": \"True\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::byte_array::ByteArray>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::byte_array::ByteArray\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::GameConfig\",\n \"members\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"settings_id\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"soulbound\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"paymaster\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"client_url\",\n \"type\": \"core::option::Option::<core::byte_array::ByteArray>\"\n },\n {\n \"name\": \"renderer\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::integer::u16>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::integer::u16>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::distribution::Distribution\",\n \"variants\": [\n {\n \"name\": \"Linear\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"Exponential\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"Uniform\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Custom\",\n \"type\": \"core::array::Span::<core::integer::u16>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::EntryFee\",\n \"members\": [\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"tournament_creator_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"game_creator_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"refund_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"game_components_interfaces::distribution::Distribution\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::felt252>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"metagame_extensions_interfaces::extension::ExtensionConfig\",\n \"members\": [\n {\n \"name\": \"address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"config\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeKind\",\n \"variants\": [\n {\n \"name\": \"BuiltIn\",\n \"type\": \"budokan_interfaces::budokan::EntryFee\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"metagame_extensions_interfaces::extension::ExtensionConfig\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<budokan_interfaces::budokan::EntryFeeKind>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeKind\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::entry_requirement::EntryRequirementType\",\n \"variants\": [\n {\n \"name\": \"token\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"extension\",\n \"type\": \"metagame_extensions_interfaces::extension::ExtensionConfig\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_requirement::EntryRequirement\",\n \"members\": [\n {\n \"name\": \"entry_limit\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"entry_requirement_type\",\n \"type\": \"game_components_interfaces::entry_requirement::EntryRequirementType\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::entry_requirement::EntryRequirement\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::LeaderboardConfig\",\n \"members\": [\n {\n \"name\": \"ascending\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"game_must_be_over\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Tournament\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"created_at\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"created_by\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"creator_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"metadata\",\n \"type\": \"budokan_interfaces::budokan::Metadata\"\n },\n {\n \"name\": \"schedule\",\n \"type\": \"budokan_interfaces::budokan::Schedule\"\n },\n {\n \"name\": \"game_config\",\n \"type\": \"budokan_interfaces::budokan::GameConfig\"\n },\n {\n \"name\": \"entry_fee\",\n \"type\": \"core::option::Option::<budokan_interfaces::budokan::EntryFeeKind>\"\n },\n {\n \"name\": \"entry_requirement\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\"\n },\n {\n \"name\": \"leaderboard_config\",\n \"type\": \"budokan_interfaces::budokan::LeaderboardConfig\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::TournamentFullState\",\n \"members\": [\n {\n \"name\": \"tournament\",\n \"type\": \"budokan_interfaces::budokan::Tournament\"\n },\n {\n \"name\": \"entry_count\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"phase\",\n \"type\": \"budokan_interfaces::budokan::Phase\"\n },\n {\n \"name\": \"protocol_fee_bps\",\n \"type\": \"core::integer::u16\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::registration::Registration\",\n \"members\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"entry_id\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"has_submitted\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"is_banned\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::RegistrationResult\",\n \"members\": [\n {\n \"name\": \"entries\",\n \"type\": \"core::array::Array::<game_components_interfaces::registration::Registration>\"\n },\n {\n \"name\": \"total\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::LeaderboardEntryView\",\n \"members\": [\n {\n \"name\": \"position\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::distribution::Distribution\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::integer::u32>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ERC20Data\",\n \"members\": [\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::option::Option::<core::integer::u32>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ERC721Data\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u128\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::TokenTypeData\",\n \"variants\": [\n {\n \"name\": \"erc20\",\n \"type\": \"game_components_interfaces::prize::ERC20Data\"\n },\n {\n \"name\": \"erc721\",\n \"type\": \"game_components_interfaces::prize::ERC721Data\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::TokenPrizePayload\",\n \"members\": [\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"token_type\",\n \"type\": \"game_components_interfaces::prize::TokenTypeData\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ExtensionPrizePayload\",\n \"members\": [\n {\n \"name\": \"address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"config\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::Prize\",\n \"variants\": [\n {\n \"name\": \"Token\",\n \"type\": \"game_components_interfaces::prize::TokenPrizePayload\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"game_components_interfaces::prize::ExtensionPrizePayload\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::PrizeRecord\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"sponsor_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"prize\",\n \"type\": \"game_components_interfaces::prize::Prize\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::PrizeType\",\n \"variants\": [\n {\n \"name\": \"Single\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"Distributed\",\n \"type\": \"(core::integer::u64, core::integer::u32)\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::felt252>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::ExtensionPrizeClaim\",\n \"members\": [\n {\n \"name\": \"prize_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::option::Option::<core::felt252>\"\n },\n {\n \"name\": \"payout_params\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::PrizeClaim\",\n \"variants\": [\n {\n \"name\": \"Token\",\n \"type\": \"game_components_interfaces::prize::PrizeType\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"budokan_interfaces::budokan::ExtensionPrizeClaim\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeRewardType\",\n \"variants\": [\n {\n \"name\": \"Position\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"TournamentCreator\",\n \"type\": \"()\"\n },\n {\n \"name\": \"GameCreator\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Refund\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"ProtocolFee\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::ExtensionEntryFeeClaim\",\n \"members\": [\n {\n \"name\": \"token_id\",\n \"type\": \"core::option::Option::<core::felt252>\"\n },\n {\n \"name\": \"claim_params\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeClaim\",\n \"variants\": [\n {\n \"name\": \"Token\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeRewardType\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"budokan_interfaces::budokan::ExtensionEntryFeeClaim\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::RewardType\",\n \"variants\": [\n {\n \"name\": \"Prize\",\n \"type\": \"budokan_interfaces::budokan::PrizeClaim\"\n },\n {\n \"name\": \"EntryFee\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeClaim\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::RewardClaimView\",\n \"members\": [\n {\n \"name\": \"reward_type\",\n \"type\": \"budokan_interfaces::budokan::RewardType\"\n },\n {\n \"name\": \"claimed\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::viewer::RewardClaimResult\",\n \"members\": [\n {\n \"name\": \"claims\",\n \"type\": \"core::array::Array::<budokan_interfaces::viewer::RewardClaimView>\"\n },\n {\n \"name\": \"total\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"total_claimed\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"total_unclaimed\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"budokan_interfaces::viewer::IBudokanViewer\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"tournaments\",\n \"inputs\": [\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_game\",\n \"inputs\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_creator\",\n \"inputs\": [\n {\n \"name\": \"creator\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_phase\",\n \"inputs\": [\n {\n \"name\": \"phase\",\n \"type\": \"budokan_interfaces::budokan::Phase\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_by_phases\",\n \"inputs\": [\n {\n \"name\": \"phases\",\n \"type\": \"core::array::Array::<budokan_interfaces::budokan::Phase>\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_game\",\n \"inputs\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_creator\",\n \"inputs\": [\n {\n \"name\": \"creator\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_phase\",\n \"inputs\": [\n {\n \"name\": \"phase\",\n \"type\": \"budokan_interfaces::budokan::Phase\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"count_tournaments_by_phases\",\n \"inputs\": [\n {\n \"name\": \"phases\",\n \"type\": \"core::array::Array::<budokan_interfaces::budokan::Phase>\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_detail\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFullState\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournaments_batch\",\n \"inputs\": [\n {\n \"name\": \"tournament_ids\",\n \"type\": \"core::array::Array::<core::integer::u64>\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<budokan_interfaces::viewer::TournamentFullState>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_registrations\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::RegistrationResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_registrations_by_owner\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::RegistrationResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_registrations_by_token_ids\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_ids\",\n \"type\": \"core::array::Array::<core::felt252>\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::RegistrationResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"leaderboard\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<budokan_interfaces::viewer::LeaderboardEntryView>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_prizes\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<game_components_interfaces::prize::PrizeRecord>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_reward_claims\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::RewardClaimResult\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"player_tournaments\",\n \"inputs\": [\n {\n \"name\": \"player_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"offset\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"limit\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::viewer::TournamentFilterResult\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"OwnableImpl\",\n \"interface_name\": \"openzeppelin_interfaces::access::ownable::IOwnable\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::access::ownable::IOwnable\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"owner\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"transfer_ownership\",\n \"inputs\": [\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"renounce_ownership\",\n \"inputs\": [],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"OwnableCamelOnlyImpl\",\n \"interface_name\": \"openzeppelin_interfaces::access::ownable::IOwnableCamelOnly\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::access::ownable::IOwnableCamelOnly\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"transferOwnership\",\n \"inputs\": [\n {\n \"name\": \"newOwner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"renounceOwnership\",\n \"inputs\": [],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"constructor\",\n \"name\": \"constructor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"budokan_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"previous_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"previous_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"OwnershipTransferred\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"OwnershipTransferStarted\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Upgraded\",\n \"type\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan_viewer::budokan_viewer::BudokanViewer::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"OwnableEvent\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"UpgradeableEvent\",\n \"type\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event\",\n \"kind\": \"flat\"\n }\n ]\n }\n]\n","[\n {\n \"type\": \"impl\",\n \"name\": \"UpgradeableImpl\",\n \"interface_name\": \"openzeppelin_interfaces::upgrades::IUpgradeable\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::upgrades::IUpgradeable\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"upgrade\",\n \"inputs\": [\n {\n \"name\": \"new_class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"BudokanRewardsAdminImpl\",\n \"interface_name\": \"budokan::budokan::Budokan::IBudokanRewardsAdmin\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"budokan::budokan::Budokan::IBudokanRewardsAdmin\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"set_rewards_class_hash\",\n \"inputs\": [\n {\n \"name\": \"new_class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"rewards_class_hash\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::class_hash::ClassHash\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"GameContextImpl\",\n \"interface_name\": \"game_components_interfaces::metagame::context::IMetagameContext\"\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::bool\",\n \"variants\": [\n {\n \"name\": \"False\",\n \"type\": \"()\"\n },\n {\n \"name\": \"True\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::metagame::context::IMetagameContext\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"has_context\",\n \"inputs\": [\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"GameContextDetailsImpl\",\n \"interface_name\": \"game_components_interfaces::metagame::context::IMetagameContextDetails\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::byte_array::ByteArray\",\n \"members\": [\n {\n \"name\": \"data\",\n \"type\": \"core::array::Array::<core::bytes_31::bytes31>\"\n },\n {\n \"name\": \"pending_word\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"pending_word_len\",\n \"type\": \"core::internal::bounded_int::BoundedInt::<0, 30>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::integer::u32>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::structs::metagame::GameContext\",\n \"members\": [\n {\n \"name\": \"name\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"value\",\n \"type\": \"core::felt252\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<game_components_interfaces::structs::metagame::GameContext>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<game_components_interfaces::structs::metagame::GameContext>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::structs::metagame::GameContextDetails\",\n \"members\": [\n {\n \"name\": \"name\",\n \"type\": \"core::byte_array::ByteArray\"\n },\n {\n \"name\": \"description\",\n \"type\": \"core::byte_array::ByteArray\"\n },\n {\n \"name\": \"id\",\n \"type\": \"core::option::Option::<core::integer::u32>\"\n },\n {\n \"name\": \"context\",\n \"type\": \"core::array::Span::<game_components_interfaces::structs::metagame::GameContext>\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::metagame::context::IMetagameContextDetails\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"context_details\",\n \"inputs\": [\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"game_components_interfaces::structs::metagame::GameContextDetails\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"BudokanImpl\",\n \"interface_name\": \"budokan_interfaces::budokan::IBudokan\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Metadata\",\n \"members\": [\n {\n \"name\": \"name\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"description\",\n \"type\": \"core::byte_array::ByteArray\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Schedule\",\n \"members\": [\n {\n \"name\": \"registration_start_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"registration_end_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_start_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_end_delay\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"submission_duration\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::byte_array::ByteArray>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::byte_array::ByteArray\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::GameConfig\",\n \"members\": [\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"settings_id\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"soulbound\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"paymaster\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"client_url\",\n \"type\": \"core::option::Option::<core::byte_array::ByteArray>\"\n },\n {\n \"name\": \"renderer\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::integer::u16>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::integer::u16>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::distribution::Distribution\",\n \"variants\": [\n {\n \"name\": \"Linear\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"Exponential\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"Uniform\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Custom\",\n \"type\": \"core::array::Span::<core::integer::u16>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::EntryFee\",\n \"members\": [\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"tournament_creator_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"game_creator_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"refund_share\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"game_components_interfaces::distribution::Distribution\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<core::felt252>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"metagame_extensions_interfaces::extension::ExtensionConfig\",\n \"members\": [\n {\n \"name\": \"address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"config\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeKind\",\n \"variants\": [\n {\n \"name\": \"BuiltIn\",\n \"type\": \"budokan_interfaces::budokan::EntryFee\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"metagame_extensions_interfaces::extension::ExtensionConfig\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<budokan_interfaces::budokan::EntryFeeKind>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeKind\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::entry_requirement::EntryRequirementType\",\n \"variants\": [\n {\n \"name\": \"token\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"extension\",\n \"type\": \"metagame_extensions_interfaces::extension::ExtensionConfig\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_requirement::EntryRequirement\",\n \"members\": [\n {\n \"name\": \"entry_limit\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"entry_requirement_type\",\n \"type\": \"game_components_interfaces::entry_requirement::EntryRequirementType\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::entry_requirement::EntryRequirement\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::LeaderboardConfig\",\n \"members\": [\n {\n \"name\": \"ascending\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"game_must_be_over\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::Tournament\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"created_at\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"created_by\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"creator_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"metadata\",\n \"type\": \"budokan_interfaces::budokan::Metadata\"\n },\n {\n \"name\": \"schedule\",\n \"type\": \"budokan_interfaces::budokan::Schedule\"\n },\n {\n \"name\": \"game_config\",\n \"type\": \"budokan_interfaces::budokan::GameConfig\"\n },\n {\n \"name\": \"entry_fee\",\n \"type\": \"core::option::Option::<budokan_interfaces::budokan::EntryFeeKind>\"\n },\n {\n \"name\": \"entry_requirement\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\"\n },\n {\n \"name\": \"leaderboard_config\",\n \"type\": \"budokan_interfaces::budokan::LeaderboardConfig\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::Phase\",\n \"variants\": [\n {\n \"name\": \"Scheduled\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Registration\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Staging\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Live\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Submission\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Finalized\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::felt252>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::integer::u256\",\n \"members\": [\n {\n \"name\": \"low\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"high\",\n \"type\": \"core::integer::u128\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_requirement::NFTQualification\",\n \"members\": [\n {\n \"name\": \"token_id\",\n \"type\": \"core::integer::u256\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::entry_requirement::QualificationProof\",\n \"variants\": [\n {\n \"name\": \"NFT\",\n \"type\": \"game_components_interfaces::entry_requirement::NFTQualification\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::entry_requirement::QualificationProof>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::entry_requirement::QualificationProof\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::array::Span::<core::felt252>>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::array::Span::<core::felt252>\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::TournamentRecipientParams\",\n \"members\": [\n {\n \"name\": \"player_address\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n },\n {\n \"name\": \"qualifier\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n },\n {\n \"name\": \"qualification\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::QualificationProof>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::PrizeType\",\n \"variants\": [\n {\n \"name\": \"Single\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"Distributed\",\n \"type\": \"(core::integer::u64, core::integer::u32)\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::ExtensionPrizeClaim\",\n \"members\": [\n {\n \"name\": \"prize_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::option::Option::<core::felt252>\"\n },\n {\n \"name\": \"payout_params\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::PrizeClaim\",\n \"variants\": [\n {\n \"name\": \"Token\",\n \"type\": \"game_components_interfaces::prize::PrizeType\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"budokan_interfaces::budokan::ExtensionPrizeClaim\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeRewardType\",\n \"variants\": [\n {\n \"name\": \"Position\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"TournamentCreator\",\n \"type\": \"()\"\n },\n {\n \"name\": \"GameCreator\",\n \"type\": \"()\"\n },\n {\n \"name\": \"Refund\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"ProtocolFee\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"budokan_interfaces::budokan::ExtensionEntryFeeClaim\",\n \"members\": [\n {\n \"name\": \"token_id\",\n \"type\": \"core::option::Option::<core::felt252>\"\n },\n {\n \"name\": \"claim_params\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::EntryFeeClaim\",\n \"variants\": [\n {\n \"name\": \"Token\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeRewardType\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"budokan_interfaces::budokan::ExtensionEntryFeeClaim\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"budokan_interfaces::budokan::RewardType\",\n \"variants\": [\n {\n \"name\": \"Prize\",\n \"type\": \"budokan_interfaces::budokan::PrizeClaim\"\n },\n {\n \"name\": \"EntryFee\",\n \"type\": \"budokan_interfaces::budokan::EntryFeeClaim\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::distribution::Distribution\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ERC20Data\",\n \"members\": [\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::option::Option::<core::integer::u32>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ERC721Data\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u128\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::TokenTypeData\",\n \"variants\": [\n {\n \"name\": \"erc20\",\n \"type\": \"game_components_interfaces::prize::ERC20Data\"\n },\n {\n \"name\": \"erc721\",\n \"type\": \"game_components_interfaces::prize::ERC721Data\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::TokenPrizePayload\",\n \"members\": [\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"token_type\",\n \"type\": \"game_components_interfaces::prize::TokenTypeData\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::ExtensionPrizePayload\",\n \"members\": [\n {\n \"name\": \"address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"config\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"game_components_interfaces::prize::Prize\",\n \"variants\": [\n {\n \"name\": \"Token\",\n \"type\": \"game_components_interfaces::prize::TokenPrizePayload\"\n },\n {\n \"name\": \"Extension\",\n \"type\": \"game_components_interfaces::prize::ExtensionPrizePayload\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"budokan_interfaces::budokan::IBudokan\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"total_tournaments\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::budokan::Tournament\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"current_phase\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::budokan::Phase\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_distribution_shares\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<core::integer::u16>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"create_tournament\",\n \"inputs\": [\n {\n \"name\": \"creator_rewards_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"metadata\",\n \"type\": \"budokan_interfaces::budokan::Metadata\"\n },\n {\n \"name\": \"schedule\",\n \"type\": \"budokan_interfaces::budokan::Schedule\"\n },\n {\n \"name\": \"game_config\",\n \"type\": \"budokan_interfaces::budokan::GameConfig\"\n },\n {\n \"name\": \"entry_fee\",\n \"type\": \"core::option::Option::<budokan_interfaces::budokan::EntryFeeKind>\"\n },\n {\n \"name\": \"entry_requirement\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\"\n },\n {\n \"name\": \"leaderboard_config\",\n \"type\": \"budokan_interfaces::budokan::LeaderboardConfig\"\n },\n {\n \"name\": \"salt\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"metadata_value\",\n \"type\": \"core::integer::u16\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"budokan_interfaces::budokan::Tournament\"\n }\n ],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"enter_tournament\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"player_name\",\n \"type\": \"core::option::Option::<core::felt252>\"\n },\n {\n \"name\": \"player_address\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n },\n {\n \"name\": \"qualifier\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\"\n },\n {\n \"name\": \"qualification\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::QualificationProof>\"\n },\n {\n \"name\": \"entry_fee_pay_params\",\n \"type\": \"core::option::Option::<core::array::Span::<core::felt252>>\"\n },\n {\n \"name\": \"salt\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"metadata_value\",\n \"type\": \"core::integer::u16\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"(core::felt252, core::integer::u32)\"\n }\n ],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"enter_tournament_for_recipients\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"recipients\",\n \"type\": \"core::array::Array::<budokan_interfaces::budokan::TournamentRecipientParams>\"\n },\n {\n \"name\": \"player_name\",\n \"type\": \"core::option::Option::<core::felt252>\"\n },\n {\n \"name\": \"salt\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"metadata_value\",\n \"type\": \"core::integer::u16\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<core::felt252>\"\n }\n ],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"ban_entry\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"game_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"proof\",\n \"type\": \"core::array::Span::<core::felt252>\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"submit_score\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"position\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"claim_reward\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"reward_type\",\n \"type\": \"budokan_interfaces::budokan::RewardType\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"add_prize\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"prize\",\n \"type\": \"game_components_interfaces::prize::Prize\"\n },\n {\n \"name\": \"position\",\n \"type\": \"core::option::Option::<core::integer::u32>\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"MetagameImpl\",\n \"interface_name\": \"game_components_interfaces::metagame::core::IMetagame\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::metagame::core::IMetagame\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"context_address\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"default_token_address\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"SRC5Impl\",\n \"interface_name\": \"openzeppelin_interfaces::introspection::ISRC5\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::introspection::ISRC5\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"supports_interface\",\n \"inputs\": [\n {\n \"name\": \"interface_id\",\n \"type\": \"core::felt252\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"OwnableImpl\",\n \"interface_name\": \"openzeppelin_interfaces::access::ownable::IOwnable\"\n },\n {\n \"type\": \"interface\",\n \"name\": \"openzeppelin_interfaces::access::ownable::IOwnable\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"owner\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"transfer_ownership\",\n \"inputs\": [\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"renounce_ownership\",\n \"inputs\": [],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"EntryFeeImpl\",\n \"interface_name\": \"game_components_interfaces::entry_fee::IEntryFee\"\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<core::integer::u16>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"core::integer::u16\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_fee::AdditionalShare\",\n \"members\": [\n {\n \"name\": \"recipient\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"share_bps\",\n \"type\": \"core::integer::u16\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"core::array::Span::<game_components_interfaces::entry_fee::AdditionalShare>\",\n \"members\": [\n {\n \"name\": \"snapshot\",\n \"type\": \"@core::array::Array::<game_components_interfaces::entry_fee::AdditionalShare>\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_fee::EntryFeeConfig\",\n \"members\": [\n {\n \"name\": \"token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"core::integer::u128\"\n },\n {\n \"name\": \"game_creator_share\",\n \"type\": \"core::option::Option::<core::integer::u16>\"\n },\n {\n \"name\": \"refund_share\",\n \"type\": \"core::option::Option::<core::integer::u16>\"\n },\n {\n \"name\": \"additional_shares\",\n \"type\": \"core::array::Span::<game_components_interfaces::entry_fee::AdditionalShare>\"\n },\n {\n \"name\": \"distribution\",\n \"type\": \"core::option::Option::<game_components_interfaces::distribution::Distribution>\"\n },\n {\n \"name\": \"distribution_count\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"enum\",\n \"name\": \"core::option::Option::<game_components_interfaces::entry_fee::EntryFeeConfig>\",\n \"variants\": [\n {\n \"name\": \"Some\",\n \"type\": \"game_components_interfaces::entry_fee::EntryFeeConfig\"\n },\n {\n \"name\": \"None\",\n \"type\": \"()\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::entry_fee::IEntryFee\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"get_entry_fee\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::option::Option::<game_components_interfaces::entry_fee::EntryFeeConfig>\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"EntryRequirementImpl\",\n \"interface_name\": \"game_components_interfaces::entry_requirement::IEntryRequirement\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::entry_requirement::QualificationEntries\",\n \"members\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"qualification_proof\",\n \"type\": \"game_components_interfaces::entry_requirement::QualificationProof\"\n },\n {\n \"name\": \"entry_count\",\n \"type\": \"core::integer::u32\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::entry_requirement::IEntryRequirement\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"get_entry_requirement\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_qualification_entries\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"proof\",\n \"type\": \"game_components_interfaces::entry_requirement::QualificationProof\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"game_components_interfaces::entry_requirement::QualificationEntries\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"PrizeImpl\",\n \"interface_name\": \"game_components_interfaces::prize::IPrize\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::prize::PrizeRecord\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"sponsor_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"prize\",\n \"type\": \"game_components_interfaces::prize::Prize\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::prize::IPrize\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"get_prize\",\n \"inputs\": [\n {\n \"name\": \"prize_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"game_components_interfaces::prize::PrizeRecord\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_total_prizes\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::integer::u64\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"is_prize_claimed\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"prize_type\",\n \"type\": \"game_components_interfaces::prize::PrizeType\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"RegistrationImpl\",\n \"interface_name\": \"game_components_interfaces::registration::IRegistration\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::registration::Registration\",\n \"members\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"entry_id\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"game_token_id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"has_submitted\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"is_banned\",\n \"type\": \"core::bool\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::registration::IRegistration\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"get_entry\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"entry_id\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"game_components_interfaces::registration::Registration\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"entry_exists\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"entry_id\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"is_token_banned\",\n \"inputs\": [\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_entry_count\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u32\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"impl\",\n \"name\": \"LeaderboardImpl\",\n \"interface_name\": \"game_components_interfaces::leaderboard::ILeaderboard\"\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::structs::leaderboard::LeaderboardEntry\",\n \"members\": [\n {\n \"name\": \"id\",\n \"type\": \"core::felt252\"\n },\n {\n \"name\": \"score\",\n \"type\": \"core::integer::u64\"\n }\n ]\n },\n {\n \"type\": \"struct\",\n \"name\": \"game_components_interfaces::structs::leaderboard::LeaderboardStoreConfig\",\n \"members\": [\n {\n \"name\": \"max_entries\",\n \"type\": \"core::integer::u32\"\n },\n {\n \"name\": \"ascending\",\n \"type\": \"core::bool\"\n },\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"game_components_interfaces::leaderboard::ILeaderboard\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"get_leaderboard_entries\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<game_components_interfaces::structs::leaderboard::LeaderboardEntry>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_leaderboard_entry\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"position\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"game_components_interfaces::structs::leaderboard::LeaderboardEntry\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_top_leaderboard_entries\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"count\",\n \"type\": \"core::integer::u32\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::array::Array::<game_components_interfaces::structs::leaderboard::LeaderboardEntry>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_position\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::option::Option::<core::integer::u32>\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"qualifies\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"score\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"is_full\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::bool\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_leaderboard_length\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u32\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get_config\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"game_components_interfaces::structs::leaderboard::LeaderboardStoreConfig\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"find_position\",\n \"inputs\": [\n {\n \"name\": \"context_id\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"score\",\n \"type\": \"core::integer::u64\"\n },\n {\n \"name\": \"token_id\",\n \"type\": \"core::felt252\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::option::Option::<core::integer::u32>\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"constructor\",\n \"name\": \"constructor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n },\n {\n \"name\": \"default_token_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_embeddable_game_standard::metagame::metagame_component::MetagameComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_embeddable_game_standard::metagame::extensions::context::context::ContextComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_introspection::src5::SRC5Component::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_metagame::leaderboard::leaderboard_component::LeaderboardComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"previous_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"previous_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"new_owner\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_access::ownable::ownable::OwnableComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"OwnershipTransferred\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"OwnershipTransferStarted\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"class_hash\",\n \"type\": \"core::starknet::class_hash::ClassHash\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Upgraded\",\n \"type\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_metagame::registration::registration_component::RegistrationComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_metagame::entry_fee::entry_fee_component::EntryFeeComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_metagame::entry_requirement::entry_requirement_component::EntryRequirementComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"game_components_metagame::prize::prize_component::PrizeComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"openzeppelin_security::reentrancyguard::ReentrancyGuardComponent::Event\",\n \"kind\": \"enum\",\n \"variants\": []\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::TournamentCreated\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"game_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"created_by\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"creator_token_id\",\n \"type\": \"core::felt252\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"metadata\",\n \"type\": \"budokan_interfaces::budokan::Metadata\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"config\",\n \"type\": \"core::felt252\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"client_url\",\n \"type\": \"core::option::Option::<core::byte_array::ByteArray>\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"renderer\",\n \"type\": \"core::option::Option::<core::starknet::contract_address::ContractAddress>\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"entry_fee\",\n \"type\": \"core::option::Option::<budokan_interfaces::budokan::EntryFeeKind>\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"entry_requirement\",\n \"type\": \"core::option::Option::<game_components_interfaces::entry_requirement::EntryRequirement>\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"protocol_fee_bps\",\n \"type\": \"core::integer::u16\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::TournamentRegistration\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"game_token_id\",\n \"type\": \"core::felt252\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"player_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"entry_number\",\n \"type\": \"core::integer::u32\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::TournamentEntryStateChanged\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"game_token_id\",\n \"type\": \"core::felt252\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"has_submitted\",\n \"type\": \"core::bool\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"is_banned\",\n \"type\": \"core::bool\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::PrizeAdded\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"prize_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"payout_position\",\n \"type\": \"core::integer::u32\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"prize\",\n \"type\": \"game_components_interfaces::prize::Prize\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"sponsor_address\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::RewardClaimed\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"reward_type\",\n \"type\": \"budokan_interfaces::budokan::RewardType\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"claimed\",\n \"type\": \"core::bool\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::QualificationEntriesUpdated\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\",\n \"kind\": \"key\"\n },\n {\n \"name\": \"qualification_proof\",\n \"type\": \"game_components_interfaces::entry_requirement::QualificationProof\",\n \"kind\": \"data\"\n },\n {\n \"name\": \"entry_count\",\n \"type\": \"core::integer::u32\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::budokan::Budokan::Event\",\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"MetagameEvent\",\n \"type\": \"game_components_embeddable_game_standard::metagame::metagame_component::MetagameComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"ContextEvent\",\n \"type\": \"game_components_embeddable_game_standard::metagame::extensions::context::context::ContextComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"SRC5Event\",\n \"type\": \"openzeppelin_introspection::src5::SRC5Component::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"LeaderboardEvent\",\n \"type\": \"game_components_metagame::leaderboard::leaderboard_component::LeaderboardComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"OwnableEvent\",\n \"type\": \"openzeppelin_access::ownable::ownable::OwnableComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"UpgradeableEvent\",\n \"type\": \"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"RegistrationEvent\",\n \"type\": \"game_components_metagame::registration::registration_component::RegistrationComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"EntryFeeEvent\",\n \"type\": \"game_components_metagame::entry_fee::entry_fee_component::EntryFeeComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"EntryRequirementEvent\",\n \"type\": \"game_components_metagame::entry_requirement::entry_requirement_component::EntryRequirementComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"PrizeEvent\",\n \"type\": \"game_components_metagame::prize::prize_component::PrizeComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"ReentrancyGuardEvent\",\n \"type\": \"openzeppelin_security::reentrancyguard::ReentrancyGuardComponent::Event\",\n \"kind\": \"flat\"\n },\n {\n \"name\": \"TournamentCreated\",\n \"type\": \"budokan::events::TournamentCreated\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"TournamentRegistration\",\n \"type\": \"budokan::events::TournamentRegistration\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"TournamentEntryStateChanged\",\n \"type\": \"budokan::events::TournamentEntryStateChanged\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"PrizeAdded\",\n \"type\": \"budokan::events::PrizeAdded\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"RewardClaimed\",\n \"type\": \"budokan::events::RewardClaimed\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"QualificationEntriesUpdated\",\n \"type\": \"budokan::events::QualificationEntriesUpdated\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"ProtocolFeeBpsUpdated\",\n \"type\": \"budokan::events::ProtocolFeeBpsUpdated\",\n \"kind\": \"nested\"\n },\n {\n \"name\": \"ProtocolFeeRecipientUpdated\",\n \"type\": \"budokan::events::ProtocolFeeRecipientUpdated\",\n \"kind\": \"nested\"\n }\n ]\n },\n {\n \"type\": \"interface\",\n \"name\": \"budokan::budokan::Budokan::IBudokanProtocolFeeAdmin\",\n \"items\": [\n {\n \"type\": \"function\",\n \"name\": \"set_protocol_fee_bps\",\n \"inputs\": [\n {\n \"name\": \"bps\",\n \"type\": \"core::integer::u16\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"set_protocol_fee_recipient\",\n \"inputs\": [\n {\n \"name\": \"recipient\",\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"outputs\": [],\n \"state_mutability\": \"external\"\n },\n {\n \"type\": \"function\",\n \"name\": \"protocol_fee_bps\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::integer::u16\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"protocol_fee_recipient\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"type\": \"core::starknet::contract_address::ContractAddress\"\n }\n ],\n \"state_mutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"tournament_protocol_fee_bps\",\n \"inputs\": [\n {\n \"name\": \"tournament_id\",\n \"type\": \"core::integer::u64\"\n }\n ],\n \"outputs\": [\n {\n \"type\": \"core::integer::u16\"\n }\n ],\n \"state_mutability\": \"view\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::ProtocolFeeBpsUpdated\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"bps\",\n \"type\": \"core::integer::u16\",\n \"kind\": \"data\"\n }\n ]\n },\n {\n \"type\": \"event\",\n \"name\": \"budokan::events::ProtocolFeeRecipientUpdated\",\n \"kind\": \"struct\",\n \"members\": [\n {\n \"name\": \"recipient\",\n \"type\": \"core::starknet::contract_address::ContractAddress\",\n \"kind\": \"key\"\n }\n ]\n }\n]\n","import type { Contract } from \"starknet\";\nimport { RpcError } from \"../errors/index.js\";\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\nfunction wrapRpcCall<T>(fn: () => Promise<T>, contractAddress?: string): Promise<T> {\n return fn().catch((error: unknown) => {\n throw new RpcError(\n error instanceof Error ? error.message : \"RPC call failed\",\n contractAddress,\n );\n });\n}\n\n// =========================================================================\n// Budokan contract read calls\n// =========================================================================\n\n/**\n * Fetch the full Custom distribution shares array for a tournament via the\n * Budokan contract's `tournament_distribution_shares(id)` view.\n *\n * Returns an empty array for tournaments configured with Linear /\n * Exponential / Uniform (those don't have a custom shares array), or for\n * tournaments that aren't configured yet.\n *\n * Consumers going through the primary API path don't need this — the\n * indexer already sources the shares from the `TournamentCreated` event.\n * This is the RPC-fallback path for direct on-chain reads.\n */\nexport async function budokanTournamentDistributionShares(\n contract: Contract,\n tournamentId: string,\n): Promise<number[]> {\n return wrapRpcCall(async () => {\n const result = await contract.call(\"tournament_distribution_shares\", [tournamentId]);\n const arr = Array.isArray(result) ? (result as unknown[]) : [];\n return arr.map((v) => Number(v));\n }, contract.address);\n}\n","import type { RpcProvider, Contract, Abi } from \"starknet\";\nimport type { BudokanClientConfig } from \"./types/config.js\";\nimport type { Tournament, TournamentListParams } from \"./types/tournament.js\";\nimport type { LeaderboardEntry } from \"./types/leaderboard.js\";\nimport type { Registration } from \"./types/registration.js\";\nimport type { Prize, RewardClaim, RewardClaimSummary, PrizeAggregation } from \"./types/prize.js\";\nimport type { PlatformStats, PrizeStats } from \"./types/activity.js\";\nimport type { QualificationEntry } from \"./types/tournament.js\";\nimport type { PaginatedResult } from \"./types/common.js\";\nimport type { WSChannel, WSEventHandler } from \"./types/websocket.js\";\nimport type { ConnectionStatusState } from \"./datasource/health.js\";\n\nimport {\n getTournaments as apiGetTournaments,\n getTournament as apiGetTournament,\n getTournamentRegistrations as apiGetTournamentRegistrations,\n getTournamentPrizes as apiGetTournamentPrizes,\n getTournamentRewardClaims as apiGetTournamentRewardClaims,\n getTournamentRewardClaimsSummary as apiGetTournamentRewardClaimsSummary,\n getTournamentQualifications as apiGetTournamentQualifications,\n getTournamentPrizeAggregation as apiGetTournamentPrizeAggregation,\n} from \"./api/tournaments.js\";\nimport {\n getGameTournaments as apiGetGameTournaments,\n getGameStats as apiGetGameStats,\n} from \"./api/games.js\";\nimport {\n getActivityStats as apiGetActivityStats,\n getPrizeStats as apiGetPrizeStats,\n} from \"./api/activity.js\";\nimport { WSManager } from \"./ws/manager.js\";\nimport { getChainConfig } from \"./chains/constants.js\";\nimport { ConnectionStatus } from \"./datasource/health.js\";\nimport { withFallback } from \"./datasource/resolver.js\";\nimport { RpcError } from \"./errors/index.js\";\nimport { createProvider, createContract } from \"./rpc/provider.js\";\nimport {\n viewerTournaments,\n viewerTournamentsByGame,\n viewerTournamentsByCreator,\n viewerTournamentsByPhase,\n viewerTournamentDetail,\n viewerTournamentsBatch,\n viewerRegistrations,\n viewerRegistrationsByTokenIds,\n viewerLeaderboard,\n viewerPrizes,\n viewerRewardClaims,\n} from \"./rpc/viewer.js\";\n\nimport viewerAbi from \"./rpc/abis/budokanViewer.json\";\nimport budokanAbi from \"./rpc/abis/budokan.json\";\nimport { budokanTournamentDistributionShares } from \"./rpc/budokan.js\";\n\n/** Resolved config with all defaults applied */\ninterface ResolvedConfig extends BudokanClientConfig {\n rpcUrl: string;\n viewerAddress: string;\n budokanAddress: string;\n}\n\n/**\n * Main client for interacting with the Budokan tournament system.\n *\n * Provides methods for querying tournaments, registrations, leaderboards,\n * prizes, player stats, and activity events. Supports real-time updates\n * via WebSocket subscriptions and automatic RPC fallback when the API is\n * unavailable.\n *\n * @example\n * ```ts\n * // API-only (default, backward compatible)\n * const client = new BudokanClient({\n * apiBaseUrl: \"https://budokan-api.provable.games\",\n * });\n *\n * // With RPC fallback\n * const client = new BudokanClient({\n * chain: \"mainnet\",\n * apiBaseUrl: \"https://budokan-api.provable.games\",\n * viewerAddress: \"0x...\",\n * });\n *\n * // RPC-only (bypass API entirely)\n * const client = new BudokanClient({\n * primarySource: \"rpc\",\n * rpcUrl: \"https://rpc.provable.games/rpc\",\n * viewerAddress: \"0x...\",\n * });\n * ```\n */\nexport class BudokanClient {\n private readonly resolvedConfig: ResolvedConfig;\n private readonly wsManager: WSManager;\n private readonly connectionStatus: ConnectionStatus;\n private cachedProvider: RpcProvider | null = null;\n private cachedViewerContract: Contract | null = null;\n private cachedBudokanContract: Contract | null = null;\n\n constructor(config: BudokanClientConfig) {\n // Merge user config with chain defaults\n const chainConfig = config.chain ? getChainConfig(config.chain) : undefined;\n this.resolvedConfig = {\n ...config,\n apiBaseUrl: config.apiBaseUrl ?? chainConfig?.apiBaseUrl ?? \"\",\n rpcUrl: config.rpcUrl ?? chainConfig?.rpcUrl ?? \"\",\n viewerAddress: config.viewerAddress ?? chainConfig?.viewerAddress ?? \"\",\n budokanAddress: config.budokanAddress ?? chainConfig?.budokanAddress ?? \"\",\n };\n\n const wsUrl = config.wsUrl ?? chainConfig?.wsUrl\n ?? this.resolvedConfig.apiBaseUrl.replace(/^http/, \"ws\").replace(/\\/$/, \"\") + \"/ws\";\n this.wsManager = new WSManager(wsUrl);\n\n this.connectionStatus = new ConnectionStatus(\n this.resolvedConfig.apiBaseUrl,\n this.resolvedConfig.rpcUrl,\n config.health,\n );\n\n // Start health monitoring if both sources are configured\n if (this.resolvedConfig.apiBaseUrl && this.resolvedConfig.rpcUrl) {\n this.connectionStatus.startMonitoring();\n }\n }\n\n // ---- Configuration ----\n\n /** Returns the resolved configuration. */\n get clientConfig(): BudokanClientConfig {\n return { ...this.resolvedConfig };\n }\n\n /** Whether the WebSocket is currently connected. */\n get wsConnected(): boolean {\n return this.wsManager.isConnected;\n }\n\n // ---- Connection status ----\n\n /** Returns the current connection status (API, RPC, mode). */\n getConnectionStatus(): ConnectionStatusState {\n return this.connectionStatus.getStatus();\n }\n\n /** Subscribe to connection status changes. Returns an unsubscribe function. */\n onConnectionStatusChange(listener: (status: ConnectionStatusState) => void): () => void {\n return this.connectionStatus.subscribe(listener);\n }\n\n // ---- Lazy RPC getters ----\n\n private async getProvider(): Promise<RpcProvider> {\n if (this.cachedProvider) return this.cachedProvider;\n if (!this.resolvedConfig.rpcUrl) {\n throw new RpcError(\"No rpcUrl configured\");\n }\n if (this.resolvedConfig.provider) {\n this.cachedProvider = this.resolvedConfig.provider;\n return this.cachedProvider;\n }\n this.cachedProvider = await createProvider(\n this.resolvedConfig.rpcUrl,\n this.resolvedConfig.rpcHeaders,\n );\n return this.cachedProvider;\n }\n\n private async getViewerContract(): Promise<Contract> {\n if (this.cachedViewerContract) return this.cachedViewerContract;\n if (!this.resolvedConfig.viewerAddress) {\n throw new RpcError(\"No viewerAddress configured. Set viewerAddress in config or use a chain preset with a deployed viewer contract.\");\n }\n const provider = await this.getProvider();\n this.cachedViewerContract = await createContract(\n viewerAbi as Abi,\n this.resolvedConfig.viewerAddress,\n provider,\n );\n return this.cachedViewerContract;\n }\n\n private async getBudokanContract(): Promise<Contract> {\n if (this.cachedBudokanContract) return this.cachedBudokanContract;\n if (!this.resolvedConfig.budokanAddress) {\n throw new RpcError(\"No budokanAddress configured. Set budokanAddress in config or use a chain preset with a deployed Budokan contract.\");\n }\n const provider = await this.getProvider();\n this.cachedBudokanContract = await createContract(\n budokanAbi as Abi,\n this.resolvedConfig.budokanAddress,\n provider,\n );\n return this.cachedBudokanContract;\n }\n\n // ---- API context ----\n\n private get apiCtx() {\n return {\n retryAttempts: this.resolvedConfig.retryAttempts,\n retryDelay: this.resolvedConfig.retryDelay,\n timeout: this.resolvedConfig.timeout,\n };\n }\n\n // ---- Tournament Queries ----\n\n /**\n * Fetch a paginated list of tournaments with optional filtering.\n * Supports RPC fallback when API is unavailable.\n */\n async getTournaments(params?: TournamentListParams): Promise<PaginatedResult<Tournament>> {\n const rpcFallback = async (): Promise<PaginatedResult<Tournament>> => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n\n // Choose the appropriate viewer filter function\n let filterResult: { tournamentIds: string[]; total: number };\n if (params?.phase) {\n filterResult = await viewerTournamentsByPhase(contract, params.phase, offset, limit);\n } else if (params?.gameAddress) {\n filterResult = await viewerTournamentsByGame(contract, params.gameAddress, offset, limit);\n } else if (params?.creator) {\n filterResult = await viewerTournamentsByCreator(contract, params.creator, offset, limit);\n } else {\n filterResult = await viewerTournaments(contract, offset, limit);\n }\n\n // Batch-fetch full tournament data for the returned IDs\n let data: Tournament[] = [];\n if (filterResult.tournamentIds.length > 0) {\n data = await viewerTournamentsBatch(contract, filterResult.tournamentIds);\n\n // Fetch prize aggregation if requested\n if (params?.includePrizeSummary) {\n const prizePromises = data.map((t) =>\n viewerPrizes(contract, t.id).catch(() => [] as Prize[]),\n );\n const allPrizes = await Promise.all(prizePromises);\n data = data.map((t, i) => {\n const prizes = allPrizes[i];\n if (prizes.length === 0) return t;\n // Build aggregation by token\n const tokenMap = new Map<string, { tokenAddress: string; tokenType: string; totalAmount: bigint; nftCount: number }>();\n for (const p of prizes) {\n // Extension prizes have no token address — not aggregable by token.\n if (p.tokenType === \"extension\" || p.tokenAddress == null) continue;\n const key = p.tokenAddress;\n const existing = tokenMap.get(key);\n if (existing) {\n existing.totalAmount += BigInt(p.amount ?? \"0\");\n if (p.tokenType === \"erc721\") existing.nftCount += 1;\n } else {\n tokenMap.set(key, {\n tokenAddress: p.tokenAddress,\n tokenType: p.tokenType,\n totalAmount: BigInt(p.amount ?? \"0\"),\n nftCount: p.tokenType === \"erc721\" ? 1 : 0,\n });\n }\n }\n return {\n ...t,\n prizeAggregation: Array.from(tokenMap.values()).map((v) => ({\n tokenAddress: v.tokenAddress,\n tokenType: v.tokenType,\n totalAmount: v.totalAmount.toString(),\n nftCount: v.nftCount,\n })),\n };\n });\n }\n }\n\n return { data, total: filterResult.total, limit, offset };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournaments(this.resolvedConfig.apiBaseUrl, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch a single tournament by its ID.\n * Supports RPC fallback when API is unavailable.\n *\n * On the RPC-fallback path, Custom distribution shares are populated via\n * a follow-up call to `tournament_distribution_shares(id)` so callers see\n * the same shape regardless of data source (the API/indexer path fills\n * shares from the `TournamentCreated` event).\n */\n async getTournament(tournamentId: string): Promise<Tournament | null> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n const tournament = await viewerTournamentDetail(contract, tournamentId);\n if (tournament) {\n await this.fillCustomSharesIfEmpty(tournament);\n }\n return tournament;\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n try {\n return await apiGetTournament(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx);\n } catch {\n // API 404 or network error — try RPC fallback\n try {\n this.connectionStatus.markApiUnavailable();\n return await rpcFallback();\n } catch {\n return null;\n }\n }\n }\n\n /**\n * If the tournament's entry-fee distribution is `Custom` with an empty\n * shares array (the on-chain `tournament()` view returns empty spans by\n * design to keep the hot path small), fetch the shares via the\n * dedicated view and graft them back onto the distribution object.\n *\n * Detection is tolerant: the Distribution shape may appear as\n * `{ variant: { Custom: [] } }` or a flattened `{ Custom: [] }`\n * depending on the starknet.js version / serialization path.\n */\n private async fillCustomSharesIfEmpty(tournament: Tournament): Promise<void> {\n const dist = tournament.entryFee?.distribution as unknown;\n if (!dist || typeof dist !== \"object\") return;\n\n const bag =\n ((dist as { variant?: Record<string, unknown> }).variant ??\n (dist as Record<string, unknown>)) as Record<string, unknown>;\n const customValue = bag.Custom ?? bag.custom;\n if (!Array.isArray(customValue) || customValue.length > 0) return;\n\n try {\n const shares = await this.getTournamentDistributionShares(tournament.id);\n if (shares.length > 0) {\n // Overwrite in place — Distribution is typed as opaque, so cast.\n (bag as Record<string, unknown>).Custom = shares;\n }\n } catch {\n // Silent — caller gets the empty array; auto-fill is best-effort.\n }\n }\n\n /**\n * Fetch the Custom distribution shares for a tournament via the Budokan\n * contract's `tournament_distribution_shares(id)` view.\n *\n * Returns an empty array for tournaments configured with\n * `Linear` / `Exponential` / `Uniform` distributions (those don't have a\n * shares array), and for tournaments without an entry fee.\n *\n * This is a direct RPC call — consumers going through the primary API\n * path typically don't need it, since the indexer sources Custom shares\n * from the `TournamentCreated` event and exposes them via\n * `getTournament()`'s `entryFee.distribution`. Use this when you need a\n * fresh on-chain read or you're operating in RPC-only mode.\n */\n async getTournamentDistributionShares(tournamentId: string): Promise<number[]> {\n const contract = await this.getBudokanContract();\n return budokanTournamentDistributionShares(contract, tournamentId);\n }\n\n /**\n * Fetch the leaderboard for a tournament from the on-chain viewer\n * contract. Live leaderboard data for UIs is best sourced via\n * denshokan-sdk's `useLiveLeaderboard`; this method is kept for\n * one-shot RPC reads (e.g. server-side scoring scripts).\n */\n async getTournamentLeaderboard(tournamentId: string): Promise<LeaderboardEntry[]> {\n const contract = await this.getViewerContract();\n // Fetch a large page; on-chain leaderboards are typically small\n return viewerLeaderboard(contract, tournamentId, 0, 1000);\n }\n\n /**\n * Fetch registrations for a tournament.\n * Supports RPC fallback when API is unavailable.\n * Note: In RPC mode, `playerAddress` and `gameAddress` fields will be empty strings,\n * and filter params (`playerAddress`, `gameTokenIds`, `hasSubmitted`, `isBanned`)\n * are applied via on-chain viewer functions where supported.\n */\n async getTournamentRegistrations(\n tournamentId: string,\n params?: { gameTokenIds?: string[]; hasSubmitted?: boolean; isBanned?: boolean; limit?: number; offset?: number },\n ): Promise<PaginatedResult<Registration>> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n if (params?.gameTokenIds?.length) {\n return viewerRegistrationsByTokenIds(contract, tournamentId, params.gameTokenIds, offset, limit);\n }\n return viewerRegistrations(contract, tournamentId, offset, limit);\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentRegistrations(this.resolvedConfig.apiBaseUrl, tournamentId, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch prizes for a tournament.\n * Supports RPC fallback when API is unavailable.\n */\n async getTournamentPrizes(tournamentId: string): Promise<Prize[]> {\n const rpcFallback = async () => {\n const contract = await this.getViewerContract();\n return viewerPrizes(contract, tournamentId);\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentPrizes(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n // ---- Game Queries ----\n\n /**\n * Fetch tournaments for a specific game.\n * Supports RPC fallback when API is unavailable.\n */\n async getGameTournaments(\n gameAddress: string,\n params?: Omit<TournamentListParams, \"gameAddress\">,\n ): Promise<PaginatedResult<Tournament>> {\n const rpcFallback = async (): Promise<PaginatedResult<Tournament>> => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 20;\n const filterResult = await viewerTournamentsByGame(contract, gameAddress, offset, limit);\n\n let data: Tournament[] = [];\n if (filterResult.tournamentIds.length > 0) {\n data = await viewerTournamentsBatch(contract, filterResult.tournamentIds);\n }\n\n return { data, total: filterResult.total, limit, offset };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetGameTournaments(this.resolvedConfig.apiBaseUrl, gameAddress, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch tournament stats for a specific game.\n * API-only — no RPC fallback available.\n */\n async getGameStats(gameAddress: string): Promise<PlatformStats> {\n return apiGetGameStats(this.resolvedConfig.apiBaseUrl, gameAddress, this.apiCtx);\n }\n\n // ---- Reward Claims & Qualifications ----\n\n /**\n * Fetch reward claims for a tournament.\n * Supports RPC fallback via viewer contract.\n */\n async getTournamentRewardClaims(\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<PaginatedResult<RewardClaim>> {\n const rpcFallback = async (): Promise<PaginatedResult<RewardClaim>> => {\n const contract = await this.getViewerContract();\n const offset = params?.offset ?? 0;\n const limit = params?.limit ?? 100;\n const result = await viewerRewardClaims(contract, tournamentId, offset, limit);\n const data: RewardClaim[] = result.claims.map((c) => ({\n tournamentId,\n ...c,\n }));\n return { data, total: result.total, limit, offset };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentRewardClaims(this.resolvedConfig.apiBaseUrl, tournamentId, params, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch reward claims summary for a tournament.\n * Supports RPC fallback via viewer contract.\n */\n async getTournamentRewardClaimsSummary(tournamentId: string): Promise<RewardClaimSummary> {\n const rpcFallback = async (): Promise<RewardClaimSummary> => {\n const contract = await this.getViewerContract();\n const result = await viewerRewardClaims(contract, tournamentId, 0, 0);\n return {\n totalPrizes: result.total,\n totalClaimed: result.totalClaimed,\n totalUnclaimed: result.totalUnclaimed,\n };\n };\n\n if (this.resolvedConfig.primarySource === \"rpc\") {\n return rpcFallback();\n }\n\n return withFallback(\n () => apiGetTournamentRewardClaimsSummary(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx),\n rpcFallback,\n this.connectionStatus,\n );\n }\n\n /**\n * Fetch qualifications for a tournament.\n * API-only -- no RPC fallback available.\n */\n async getTournamentQualifications(\n tournamentId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<PaginatedResult<QualificationEntry>> {\n return apiGetTournamentQualifications(this.resolvedConfig.apiBaseUrl, tournamentId, params, this.apiCtx);\n }\n\n /**\n * Fetch prize aggregation for a tournament.\n * API-only -- no RPC fallback available.\n */\n async getTournamentPrizeAggregation(tournamentId: string): Promise<PrizeAggregation[]> {\n return apiGetTournamentPrizeAggregation(this.resolvedConfig.apiBaseUrl, tournamentId, this.apiCtx);\n }\n\n // ---- Activity Queries (API-only, activity is indexed) ----\n\n /**\n * Fetch platform-wide activity stats.\n * API-only — no RPC fallback available.\n */\n async getActivityStats(): Promise<PlatformStats> {\n return apiGetActivityStats(this.resolvedConfig.apiBaseUrl, this.apiCtx);\n }\n\n /**\n * Fetch platform-wide prize stats.\n * API-only — no RPC fallback available.\n */\n async getPrizeStats(): Promise<PrizeStats> {\n return apiGetPrizeStats(this.resolvedConfig.apiBaseUrl, this.apiCtx);\n }\n\n // ---- WebSocket ----\n\n /**\n * Open a WebSocket connection for real-time updates.\n */\n connect(): void {\n this.wsManager.connect();\n }\n\n /**\n * Close the WebSocket connection.\n */\n disconnect(): void {\n this.wsManager.disconnect();\n }\n\n /**\n * Stop health monitoring and close all connections.\n */\n destroy(): void {\n this.connectionStatus.destroy();\n this.wsManager.disconnect();\n }\n\n /**\n * Subscribe to WebSocket channels with optional tournament filtering.\n * Returns an unsubscribe function.\n */\n subscribe(\n channels: WSChannel[],\n handler: WSEventHandler,\n tournamentIds?: string[],\n ): () => void {\n return this.wsManager.subscribe({ channels, tournamentIds }, handler);\n }\n\n /**\n * Register a listener for WebSocket connection state changes.\n * Returns an unsubscribe function.\n */\n onWsConnectionChange(listener: (connected: boolean) => void): () => void {\n return this.wsManager.onConnectionChange(listener);\n }\n}\n\n/**\n * Factory function for creating a BudokanClient instance.\n */\nexport function createBudokanClient(config: BudokanClientConfig): BudokanClient {\n return new BudokanClient(config);\n}\n","import type {\n ExtensionPrize as MetagameSdkExtensionPrize,\n Prize as MetagameSdkTokenPrize,\n PrizeLike as MetagameSdkPrizeLike,\n} from \"@provable-games/metagame-sdk\";\nimport type {\n ExtensionPrize,\n Prize,\n TokenPrize,\n} from \"../types/prize.js\";\n\n// Adapter output types are derived from metagame-sdk@0.1.13. These exported\n// aliases are part of Budokan's public API; changing the pinned metagame-sdk\n// version needs a compatibility review.\nexport type MetagameTokenPrize = MetagameSdkTokenPrize;\nexport type MetagameExtensionPrize = MetagameSdkExtensionPrize;\nexport type MetagamePrizeLike = MetagameSdkPrizeLike;\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isNonNegativeIntegerString(value: unknown): value is string {\n if (!isNonEmptyString(value) || value.trim() !== value) return false;\n if (!/^\\d+$/.test(value)) return false;\n\n try {\n return BigInt(value) >= 0n;\n } catch {\n return false;\n }\n}\n\nfunction isNonNegativeIntegerNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value) && value >= 0;\n}\n\nfunction isPositiveIntegerNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value) && value > 0;\n}\n\nfunction isDistributionType(value: unknown): value is string {\n return (\n value === \"linear\" ||\n value === \"exponential\" ||\n value === \"uniform\" ||\n value === \"custom\"\n );\n}\n\nfunction hasNoDistributionFields(prize: Prize): boolean {\n return (\n prize.distributionType === null &&\n prize.distributionWeight === null &&\n prize.distributionShares === null &&\n prize.distributionCount === null\n );\n}\n\nfunction hasValidDistributionFields(prize: Prize): boolean {\n if (prize.distributionType === null) return hasNoDistributionFields(prize);\n if (!isDistributionType(prize.distributionType)) return false;\n if (!isPositiveIntegerNumber(prize.distributionCount)) return false;\n\n if (prize.distributionType === \"custom\") {\n return (\n prize.distributionWeight === null &&\n Array.isArray(prize.distributionShares) &&\n prize.distributionShares.length === prize.distributionCount &&\n prize.distributionShares.every(isNonNegativeIntegerNumber) &&\n prize.distributionShares.reduce((sum, share) => sum + share, 0) === 10000\n );\n }\n\n if (prize.distributionType === \"uniform\") {\n return prize.distributionWeight === null && prize.distributionShares === null;\n }\n\n return (\n isNonNegativeIntegerNumber(prize.distributionWeight) &&\n prize.distributionShares === null\n );\n}\n\nfunction hasBasePrizeFields(prize: Prize): boolean {\n return (\n isNonNegativeIntegerString(prize.prizeId) &&\n isNonNegativeIntegerString(prize.tournamentId) &&\n Number.isInteger(prize.payoutPosition) &&\n prize.payoutPosition >= 0 &&\n isNonEmptyString(prize.sponsorAddress)\n );\n}\n\nfunction hasExtensionConfig(value: unknown): boolean {\n return (\n value === null ||\n (Array.isArray(value) && value.every((entry) => typeof entry === \"string\"))\n );\n}\n\nfunction describePrize(prize: Prize): string {\n const prizeId = isNonEmptyString(prize.prizeId) ? prize.prizeId : \"<invalid>\";\n return `prizeId=${prizeId}, tokenType=${prize.tokenType}`;\n}\n\nfunction malformedTokenPrizeError(\n action: \"adapt\" | \"read\",\n prize: Prize,\n): TypeError {\n return new TypeError(\n `Cannot ${action} malformed Budokan token prize (${describePrize(prize)})`,\n );\n}\n\nfunction malformedExtensionPrizeError(\n action: \"adapt\",\n prize: Prize,\n): TypeError {\n return new TypeError(\n `Cannot ${action} malformed Budokan extension prize (${\n describePrize(prize)\n })`,\n );\n}\n\nfunction assertMetagameTokenPosition(prize: TokenPrize): void {\n if (Number.isInteger(prize.payoutPosition) && prize.payoutPosition > 0) {\n return;\n }\n\n if (prize.payoutPosition !== 0) {\n throw new TypeError(\n `Cannot adapt Budokan token prize with invalid payout position (${\n describePrize(prize)\n })`,\n );\n }\n\n throw new TypeError(\n `Cannot adapt Budokan token prize with unhydrated payout position (${\n describePrize(prize)\n })`,\n );\n}\n\nfunction assertMetagameExtensionPosition(prize: ExtensionPrize): void {\n if (Number.isInteger(prize.payoutPosition) && prize.payoutPosition > 0) {\n return;\n }\n\n if (prize.payoutPosition !== 0) {\n throw new TypeError(\n `Cannot adapt Budokan extension prize with invalid payout position (${\n describePrize(prize)\n })`,\n );\n }\n\n throw new TypeError(\n `Cannot adapt Budokan extension prize with unhydrated payout position (${\n describePrize(prize)\n })`,\n );\n}\n\nfunction hasHydratedPayoutPosition(prize: Prize): boolean {\n return prize.payoutPosition > 0;\n}\n\nexport function isRawTokenPrize(prize: Prize): prize is TokenPrize {\n if (\n !hasBasePrizeFields(prize) ||\n !isNonEmptyString(prize.tokenAddress)\n ) {\n return false;\n }\n\n return prize.tokenType === \"erc20\"\n ? isNonNegativeIntegerString(prize.amount) &&\n prize.tokenId === null &&\n prize.extensionAddress === null &&\n prize.extensionConfig === null &&\n hasValidDistributionFields(prize)\n : prize.tokenType === \"erc721\" &&\n prize.amount === null &&\n isNonNegativeIntegerString(prize.tokenId) &&\n prize.extensionAddress === null &&\n prize.extensionConfig === null &&\n hasNoDistributionFields(prize);\n}\n\nexport function isRawExtensionPrize(prize: Prize): prize is ExtensionPrize {\n return (\n hasBasePrizeFields(prize) &&\n prize.tokenType === \"extension\" &&\n prize.tokenAddress === null &&\n prize.amount === null &&\n prize.tokenId === null &&\n hasNoDistributionFields(prize) &&\n isNonEmptyString(prize.extensionAddress) &&\n hasExtensionConfig(prize.extensionConfig)\n );\n}\n\nexport function isTokenPrize(prize: Prize): prize is TokenPrize {\n return isRawTokenPrize(prize) && hasHydratedPayoutPosition(prize);\n}\n\nexport function isExtensionPrize(prize: Prize): prize is ExtensionPrize {\n return isRawExtensionPrize(prize) && hasHydratedPayoutPosition(prize);\n}\n\n/**\n * Returns true when a prize is a valid Budokan token/extension prize and has a\n * hydrated leaderboard position suitable for the metagame prize shape.\n */\nexport function isMetagameAdaptablePrize(\n prize: Prize,\n): prize is TokenPrize | ExtensionPrize {\n return isTokenPrize(prize) || isExtensionPrize(prize);\n}\n\n/**\n * Returns validated raw token prizes. Extension records are skipped without\n * validation; malformed `erc20`/`erc721` records throw instead of being\n * silently dropped. RPC records with `payoutPosition === 0` are returned here\n * for raw token-prize visibility.\n */\nexport function getRawTokenPrizes(prizes: readonly Prize[]): TokenPrize[] {\n return prizes.flatMap((prize) => {\n if (isRawTokenPrize(prize)) return [prize];\n if (prize.tokenType === \"extension\") return [];\n\n throw malformedTokenPrizeError(\"read\", prize);\n });\n}\n\n/**\n * Returns validated hydrated token prizes. Extension records are skipped\n * without validation, and valid raw token prizes with `payoutPosition === 0`\n * are skipped; malformed `erc20`/`erc721` records throw instead of being\n * silently dropped.\n */\nexport function getTokenPrizes(prizes: readonly Prize[]): TokenPrize[] {\n return prizes.flatMap((prize) => {\n if (isTokenPrize(prize)) return [prize];\n if (isRawTokenPrize(prize) || prize.tokenType === \"extension\") return [];\n\n throw malformedTokenPrizeError(\"read\", prize);\n });\n}\n\n/**\n * Converts a guard-validated Budokan token prize into the Metagame SDK token\n * prize shape. Metagame token prizes do not carry Budokan distribution fields,\n * so distributed ERC20 prizes are represented by their aggregate `amount` at\n * `payoutPosition`; use the original Budokan `Prize` for payout-split math.\n * For ERC721 prizes, metagame-sdk@0.1.13 uses `amount` to carry the token ID.\n * Throws when `payoutPosition` is zero because the RPC path uses zero for\n * unhydrated token-prize positions and metagame positions are leaderboard slots.\n */\nexport function toMetagameTokenPrize(\n prize: TokenPrize,\n): MetagameTokenPrize {\n assertMetagameTokenPosition(prize);\n if (!isRawTokenPrize(prize)) {\n throw malformedTokenPrizeError(\"adapt\", prize);\n }\n\n const adapted = {\n id: prize.prizeId,\n position: prize.payoutPosition,\n tokenAddress: prize.tokenAddress,\n tokenType: prize.tokenType,\n // Metagame token prizes use `amount` as the token id for ERC721 entries.\n amount: prize.tokenType === \"erc20\" ? prize.amount : prize.tokenId,\n sponsorAddress: prize.sponsorAddress,\n } satisfies MetagameTokenPrize;\n\n return adapted;\n}\n\n/**\n * Converts a guard-validated Budokan extension prize into the Metagame SDK\n * extension-prize shape. Throws when `payoutPosition` is zero because metagame\n * positions are leaderboard slots and the RPC path uses zero for unhydrated\n * prize positions.\n */\nexport function toMetagameExtensionPrize(\n prize: ExtensionPrize,\n): MetagameExtensionPrize {\n assertMetagameExtensionPosition(prize);\n if (!isRawExtensionPrize(prize)) {\n throw malformedExtensionPrizeError(\"adapt\", prize);\n }\n\n const adapted = {\n id: prize.prizeId,\n position: prize.payoutPosition,\n tokenAddress: null,\n tokenType: \"extension\",\n amount: null,\n sponsorAddress: prize.sponsorAddress,\n extensionAddress: prize.extensionAddress,\n extensionConfig: prize.extensionConfig,\n } satisfies MetagameExtensionPrize;\n\n return adapted;\n}\n\n/**\n * Converts supported Budokan prize variants into Metagame SDK prize shapes.\n * Throws when a prize has malformed fields or an unhydrated payout position.\n * Raw-but-valid zero-position prizes throw the unhydrated-position error.\n * See `toMetagameTokenPrize` for token prize distribution behavior.\n */\nexport function toMetagamePrize(\n prize: Prize,\n): MetagamePrizeLike {\n if (isRawTokenPrize(prize)) return toMetagameTokenPrize(prize);\n if (isRawExtensionPrize(prize)) return toMetagameExtensionPrize(prize);\n\n throw new TypeError(\n `Cannot adapt malformed Budokan prize (${describePrize(prize)})`,\n );\n}\n\n/**\n * Non-throwing metagame adapter. Returns null for malformed prize records and\n * for valid RPC-sourced prizes whose `payoutPosition` is not hydrated yet.\n */\nexport function tryToMetagamePrize(\n prize: Prize,\n): MetagamePrizeLike | null {\n if (!isMetagameAdaptablePrize(prize)) return null;\n return prize.tokenType === \"extension\"\n ? toMetagameExtensionPrize(prize)\n : toMetagameTokenPrize(prize);\n}\n\n/**\n * Converts supported Budokan prize variants into Metagame SDK prize shapes.\n * Throws when any prize has malformed fields or an unhydrated payout position.\n * See `toMetagameTokenPrize` for token prize distribution behavior.\n */\nexport function toMetagamePrizes(\n prizes: readonly Prize[],\n): MetagamePrizeLike[] {\n return prizes.map(toMetagamePrize);\n}\n\n/**\n * Non-throwing batch metagame adapter. Skips malformed records and valid\n * RPC-sourced prizes whose `payoutPosition` is not hydrated yet.\n */\nexport function tryToMetagamePrizes(\n prizes: readonly Prize[],\n): MetagamePrizeLike[] {\n return prizes.flatMap((prize) => {\n const adapted = tryToMetagamePrize(prize);\n return adapted ? [adapted] : [];\n });\n}\n\n/**\n * Converts Budokan token prizes into Metagame SDK token prize shapes. Extension\n * records are skipped without validation. Throws for malformed token records\n * and unhydrated token positions. See `toMetagameTokenPrize` for distribution\n * behavior.\n */\nexport function toMetagameTokenPrizes(\n prizes: readonly Prize[],\n): MetagameTokenPrize[] {\n return prizes.flatMap((prize) => {\n if (isRawTokenPrize(prize)) return [toMetagameTokenPrize(prize)];\n if (prize.tokenType === \"extension\") return [];\n\n throw malformedTokenPrizeError(\"adapt\", prize);\n });\n}\n","/**\n * Whitelisted games and per-game metadata. The on-chain denshokan registry\n * is the source of truth for which games *exist*; this whitelist is the\n * subset we recommend / support, plus extra metadata that doesn't live on\n * chain (homepage URL, default fee config, controller-only flag, etc.).\n *\n * Lifted out of the budokan client (formerly\n * `client/src/assets/games/index.tsx`) so other integrations — the\n * Telegram bot in `examples/telegram-controller-bot/`, third-party\n * consumers — can use the same list without copy-pasting.\n *\n * Addresses are stored in canonical normalized form (0x-prefixed,\n * 66 chars, lowercase). Lookups normalize their input.\n */\nimport { normalizeAddress } from \"../utils/address.js\";\nimport type { ChainConfig } from \"../chains/constants.js\";\n\n/** Subset of chain identifiers the whitelist covers. */\nexport type WhitelistChain = \"mainnet\" | \"sepolia\";\n\nexport interface WhitelistedGame {\n /** Canonical 0x-prefixed, 66-char lowercase contract address. */\n contractAddress: string;\n /** Display name. */\n name: string;\n /** Optional remote logo URL. The SDK never bundles binary assets — host externally. */\n imageUrl?: string;\n /** Game's homepage / landing URL. */\n url?: string;\n /** Direct-play URL template. May include `{tokenId}`. */\n playUrl?: string;\n /** Optional spectator URLs. */\n watchLink?: string;\n replayLink?: string;\n /** True if the game requires a Cartridge Controller to play. */\n controllerOnly?: boolean;\n /** Hide from default listings while keeping the metadata around. */\n disabled?: boolean;\n /** Minimum entry fee floor in USD, used as a UX hint at tournament-create time. */\n minEntryFeeUsd?: number;\n /** Recommended ERC-20 token for entry fee on this chain. */\n defaultEntryFeeToken?: string;\n /** Game-creator share of entry fee (basis-points-style — `5` means 5%). */\n defaultGameFeePercentage?: number;\n /** Approximate gas cost per entry, in USD — UX hint only. */\n averageGasCostUsd?: number;\n /** Some game tokens use animated SVG that needs `<object>` rather than `<img>`. */\n objectImage?: boolean;\n /**\n * Score ordering. `true` = lower-is-better (golf-style), `false` = higher-\n * is-better (points-style). Defaults to false when omitted — most games\n * are points-based.\n */\n leaderboardAscending?: boolean;\n /**\n * Whether the game's score is only valid once the game is in a completed\n * (e.g. dead, finished) state. Tournament-creation UIs hide this question\n * when the property of the game is known. Defaults to false.\n */\n leaderboardGameMustBeOver?: boolean;\n}\n\nconst STRK = \"0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d\";\n\nconst MAINNET_GAMES_RAW: readonly WhitelistedGame[] = [\n {\n contractAddress: \"0x4de0351ceab4ecd50be6ee09329b0dcb3b96a9da88cc158f453823a389722fa\",\n name: \"Death Mountain\",\n url: \"https://deathmountain.gg/\",\n playUrl: \"https://deathmountain.gg/play?id=\",\n watchLink: \"https://deathmountain.gg/watch?id=\",\n replayLink: \"https://deathmountain.gg/replay?id=\",\n controllerOnly: true,\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n defaultGameFeePercentage: 5,\n averageGasCostUsd: 0.25,\n },\n {\n contractAddress: \"0x642f228f70b1ca7edb4ab7ff0bab067369c2e276ddc2570ca18802d4e758edc\",\n name: \"zKube\",\n imageUrl: \"https://zkube-budokan-sepolia.vercel.app/assets/logo.png\",\n url: \"https://zkube.io\",\n playUrl: \"https://zkube.io/play/\",\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n },\n];\n\nconst SEPOLIA_GAMES_RAW: readonly WhitelistedGame[] = [\n {\n contractAddress: \"0x04359aee29873cd9603207d29b4140468bac3e042aa10daab2e1a8b2dd60ef7b\",\n name: \"Dark Shuffle\",\n imageUrl: \"https://darkshuffle.dev/favicon.svg\",\n url: \"https://darkshuffle.dev\",\n controllerOnly: true,\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n },\n {\n contractAddress: \"0x07ae26eecf0274aabb31677753ff3a4e15beec7268fa1b104f73ce3c89202831\",\n name: \"Death Mountain\",\n imageUrl: \"https://darkshuffle.dev/favicon.svg\",\n url: \"https://lootsurvivor.io/\",\n playUrl: \"https://lootsurvivor.io/survivor/play?id=\",\n controllerOnly: true,\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n },\n {\n contractAddress: \"0x012ccc9a2d76c836d088203f6e9d62e22d1a9f7479d1aea8b503a1036c0f4487\",\n name: \"Nums\",\n url: \"https://nums-blond.vercel.app/\",\n playUrl: \"https://nums-blond.vercel.app/\",\n controllerOnly: true,\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n },\n {\n contractAddress: \"0x3a2ea07f0f49c770035eed9a010eb3d1e1bc3cb92e1d47eef2ad75a25c6bdb2\",\n name: \"Number Guess\",\n url: \"https://funfactory.gg/games/1\",\n playUrl: \"https://funfactory.gg/tokens/{tokenId}/play\",\n controllerOnly: true,\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n objectImage: true,\n },\n {\n contractAddress: \"0x5e02a1f750b3fa0e835d454705b664ecb23166cdb49459b1c96c1e3eaf9a2f4\",\n name: \"zKube\",\n imageUrl: \"https://zkube-budokan-sepolia.vercel.app/assets/logo.png\",\n url: \"https://zkube-budokan-sepolia.vercel.app\",\n playUrl: \"https://zkube-budokan-sepolia.vercel.app/play/\",\n controllerOnly: true,\n minEntryFeeUsd: 0.25,\n defaultEntryFeeToken: STRK,\n },\n];\n\n// Normalize once at module load — addresses in the source list above are\n// inconsistently padded; storing canonical form simplifies lookups.\nconst MAINNET_GAMES: readonly WhitelistedGame[] = MAINNET_GAMES_RAW.map(canonicalize);\nconst SEPOLIA_GAMES: readonly WhitelistedGame[] = SEPOLIA_GAMES_RAW.map(canonicalize);\n\nfunction canonicalize(game: WhitelistedGame): WhitelistedGame {\n return {\n ...game,\n contractAddress: normalizeAddress(game.contractAddress),\n defaultEntryFeeToken: game.defaultEntryFeeToken\n ? normalizeAddress(game.defaultEntryFeeToken)\n : undefined,\n };\n}\n\n/**\n * Whitelisted games for a chain, sorted by name with disabled entries last.\n *\n * Returns a frozen copy — mutations don't bleed back into the module state.\n */\nexport function getWhitelistedGames(chain: WhitelistChain): WhitelistedGame[] {\n const list = chain === \"mainnet\" ? MAINNET_GAMES : SEPOLIA_GAMES;\n // Clone the objects, not just the array, so a caller mutating a returned\n // game can't corrupt the module's canonical entries (and future lookups).\n return list.map((g) => ({ ...g })).sort((a, b) => {\n const aDisabled = a.disabled ?? false;\n const bDisabled = b.disabled ?? false;\n if (aDisabled !== bDisabled) return aDisabled ? 1 : -1;\n return a.name.localeCompare(b.name);\n });\n}\n\n/**\n * Look up a single whitelisted game by contract address. Address is normalized\n * before comparison so callers can pass any padding.\n */\nexport function findWhitelistedGame(\n chain: WhitelistChain,\n contractAddress: string,\n): WhitelistedGame | undefined {\n const target = normalizeAddress(contractAddress);\n return getWhitelistedGames(chain).find((g) => g.contractAddress === target);\n}\n\n/** True if the given game is on the whitelist. */\nexport function isGameWhitelisted(chain: WhitelistChain, contractAddress: string): boolean {\n return findWhitelistedGame(chain, contractAddress) !== undefined;\n}\n\n/**\n * Defaults block — what UI surfaces should pre-fill when the user picks this\n * game. Falls back to per-chain sensible defaults (STRK as fee token, 1% fee,\n * $0.25 minimum) when the game isn't whitelisted, so callers don't have to\n * special-case missing entries.\n */\nexport interface GameDefaults {\n minEntryFeeUsd: number;\n defaultEntryFeeToken: string;\n defaultGameFeePercentage: number;\n averageGasCostUsd: number | undefined;\n /** Inherited leaderboard ordering (true = lower wins, false = higher wins). */\n leaderboardAscending: boolean;\n /** Inherited \"must finish game before submitting\" flag. */\n leaderboardGameMustBeOver: boolean;\n}\n\nexport function getGameDefaults(\n chain: WhitelistChain,\n contractAddress: string,\n): GameDefaults {\n const game = findWhitelistedGame(chain, contractAddress);\n return {\n minEntryFeeUsd: game?.minEntryFeeUsd ?? 0.25,\n defaultEntryFeeToken: game?.defaultEntryFeeToken ?? STRK,\n defaultGameFeePercentage: game?.defaultGameFeePercentage ?? 1,\n averageGasCostUsd: game?.averageGasCostUsd,\n leaderboardAscending: game?.leaderboardAscending ?? false,\n leaderboardGameMustBeOver: game?.leaderboardGameMustBeOver ?? false,\n };\n}\n\n// Re-export so consumers don't have to reach into chains/.\nexport type { ChainConfig };\n","/**\n * Calldata builders for Budokan's on-chain entrypoints.\n *\n * Each builder is a pure function that returns a starknet.js `Call` —\n * `{ contractAddress, entrypoint, calldata }` — without signing or\n * executing anything. Callers pass the returned Call to\n * `account.execute([...])` themselves so this module is decoupled from\n * how an integrator obtains an account (controller, sessions, agent\n * wallets, signing servers).\n *\n * Cairo encoding gotchas this module hides from callers:\n * - Option<T> and custom enums must be wrapped in `CairoOption` /\n * `CairoCustomEnum`. Plain `{ type, variant }` objects look right but\n * CallData.compile treats them as generic structs and serializes the\n * type-name string as a ByteArray — i.e. produces garbage calldata.\n * - `Metadata.description` is a ByteArray (3+ felts). A plain JS\n * string becomes a single felt and the deserializer reverts with\n * \"Failed to deserialize param\".\n * - Cairo enum variant tags are 0-indexed in declaration order; the\n * manually-built calldata in enter/claim/submit follows this order\n * exactly. References:\n * contracts/packages/interfaces/src/budokan.cairo (RewardType,\n * EntryFeeRewardType, EntryRequirementType, Distribution)\n * game-components/.../prize.cairo (PrizeType)\n *\n * Used today by the Telegram bot in\n * `examples/telegram-controller-bot/`. Any other integration that needs\n * to drive the same contract (a Discord bot, a CLI, agent code) should\n * import from here so we don't fork the encoding logic again.\n */\n\nimport {\n byteArray,\n CairoCustomEnum,\n CairoOption,\n CairoOptionVariant,\n CallData,\n hash,\n num,\n uint256,\n} from \"starknet\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface Call {\n contractAddress: string;\n entrypoint: string;\n calldata: string[];\n}\n\n/**\n * Shape of the entry-fee distribution. Mirrors the Cairo `Distribution`\n * enum (Linear / Exponential / Uniform / Custom). The integer `weight`\n * is in client units — the encoder scales it ×10 to match the on-chain\n * convention the budokan client uses, so distributions created via this\n * SDK and via budokan.gg render identically.\n */\nexport type DistributionSpec =\n | { kind: \"linear\"; weight: number }\n | { kind: \"exponential\"; weight: number }\n | { kind: \"uniform\" };\n\nexport interface EntryFeeArgs {\n tokenAddress: string;\n /** Raw u128 amount in smallest token units (decimal string). */\n amount: string;\n /** All shares are basis points (0–10000). Sum + leaderboard pool = 10000. */\n tournamentCreatorShare: number;\n gameCreatorShare: number;\n refundShare: number;\n distribution: DistributionSpec;\n /** Number of top placements that share the leaderboard pool. */\n distributionCount: number;\n}\n\n/**\n * Entry-requirement gating. Two variants on the chain's\n * EntryRequirementType enum:\n * - token: ContractAddress — must own a token from this contract\n * - extension: ExtensionConfig — validator contract + config Span\n *\n * For \"extension\" callers build the `config` Span<felt252> in the exact\n * felt order the target validator's `add_config` expects (see\n * `src/extensions` for preset builders that produce this for the\n * shared deployed validators).\n */\nexport type EntryRequirementSpec =\n | { kind: \"token\"; tokenAddress: string }\n | { kind: \"extension\"; address: string; config: string[] };\n\nexport interface EntryRequirementArgs {\n /** Max entries per qualifying token / extension match. */\n entryLimit: number;\n type: EntryRequirementSpec;\n}\n\nexport interface EnterTournamentArgs {\n tournamentId: string;\n /**\n * Mint recipient. Encoded as `Option<ContractAddress>` — omit for\n * `None` (the contract defaults the mint to the caller).\n */\n playerAddress?: string;\n /** Optional felt252 short string (≤31 ASCII bytes). Omit → Option::None. */\n playerName?: string;\n /**\n * Third-party qualifier to claim, as `Option<ContractAddress>`. Omit for\n * `None` (caller is the qualifier — the common path). Only needed for\n * sponsor flows against gated tournaments.\n */\n qualifier?: string;\n /**\n * `entry_fee_pay_params` (`Option<Span<felt252>>`). Required only for\n * tournaments with an `EntryFeeKind::Extension` fee — the felts the fee\n * extension expects. Omit for the built-in fee flow (Option::None).\n */\n entryFeePayParams?: string[];\n salt?: number;\n metadataValue?: number;\n}\n\nexport interface CreateTournamentArgs {\n creatorRewardsAddress: string;\n /** ≤31 ASCII bytes (felt252 short string). */\n name: string;\n description: string;\n gameAddress: string;\n settingsId: number;\n schedule: {\n registrationStartDelay: number;\n registrationEndDelay: number;\n gameStartDelay: number;\n gameEndDelay: number;\n submissionDuration: number;\n };\n leaderboard: { ascending: boolean; gameMustBeOver: boolean };\n /** Encoded as Option::Some(EntryFeeKind::BuiltIn(EntryFee)) when set. */\n entryFee?: EntryFeeArgs;\n /** Encoded as Option::Some(EntryRequirement) on chain when set. */\n entryRequirement?: EntryRequirementArgs;\n salt?: number;\n metadataValue?: number;\n}\n\n/**\n * Token prize payload. Mirrors the Cairo `TokenTypeData` enum.\n *\n * - `erc20` — fungible. `amount` is required; `distribution` optional\n * (undefined → single winner-takes-all payout). When `distribution`\n * is set, `distributionCount` is required (number of paid positions).\n * - `erc721` — single NFT. `tokenId` is the u128 id of the token the\n * sponsor is escrowing.\n */\nexport type TokenTypeSpec =\n | {\n kind: \"erc20\";\n /** Raw u128 amount (decimal string). */\n amount: string;\n distribution?: DistributionSpec;\n distributionCount?: number;\n }\n | { kind: \"erc721\"; tokenId: string };\n\n/**\n * Tagged union mirroring the on-chain `Prize` enum.\n *\n * - `config` — built-in path: sponsor escrows an ERC20/ERC721 prize via\n * the budokan PrizeComponent; `position` selects a leaderboard slot\n * for non-distributed prizes (ignored for distributed ERC20).\n * - `extension` — external `IPrizeExtension`: budokan forwards the\n * `config` blob to `IPrizeExtension.add_prize`. `position` is ignored\n * (the extension owns position semantics).\n */\nexport type PrizeSpec =\n | {\n kind: \"token\";\n tokenAddress: string;\n tokenType: TokenTypeSpec;\n /** Leaderboard slot for single (non-distributed) prizes. Omit for distributed. */\n position?: number;\n }\n | {\n kind: \"extension\";\n /** Address of the contract implementing `IPrizeExtension`. */\n address: string;\n /** Opaque payload forwarded to `IPrizeExtension.add_prize`. */\n config: string[];\n };\n\nexport interface AddPrizeArgs {\n tournamentId: string;\n prize: PrizeSpec;\n}\n\n/**\n * Tagged union mirroring the Cairo `RewardType` enum hierarchy:\n *\n * variant 0: Prize(PrizeClaim)\n * PrizeClaim variant 0: Token(PrizeType)\n * PrizeType variant 0: Single(u64)\n * PrizeType variant 1: Distributed((u64, u8))\n * PrizeClaim variant 1: Extension({prize_id, position, payout_params})\n * variant 1: EntryFee(EntryFeeClaim)\n * EntryFeeClaim variant 0: Token(EntryFeeRewardType)\n * EntryFeeRewardType variant 0: Position(u32)\n * EntryFeeRewardType variant 1: TournamentCreator\n * EntryFeeRewardType variant 2: GameCreator\n * EntryFeeRewardType variant 3: Refund(felt252)\n * EntryFeeClaim variant 1: Extension(ExtensionEntryFeeClaim)\n *\n * Extension claims are pure pass-through on the host: budokan forwards\n * `(token_id, payout_params)` to the extension and lets it resolve\n * recipient + eligibility from its own state. Callers don't supply\n * recipient or position — the extension derives them.\n *\n * Conventions:\n * - `tokenId` is the game token claiming. Positional extensions\n * (NFTPrize, NFTEntryFee) use it to look up the leaderboard\n * position; ownership-based extensions use it to derive the\n * recipient via `owner_of`.\n * - `tokenId: undefined` signals a non-claim flow (sponsor refund,\n * dao distribution, raffle draw). The extension extracts whatever\n * it needs from `payoutParams` / `claimParams` — e.g. NFTPrize\n * reads `payoutParams[0]` as the slot index to refund.\n */\nexport type RewardType =\n | { kind: \"prize_single\"; prizeId: string }\n | { kind: \"prize_distributed\"; prizeId: string; payoutPosition: number }\n | {\n kind: \"prize_extension\";\n prizeId: string;\n /**\n * Game token claiming the prize, or undefined for non-claim flows\n * (sponsor refunds, raffle draws, etc.).\n */\n tokenId?: string;\n payoutParams: string[];\n }\n | { kind: \"entry_fee_position\"; position: number }\n | { kind: \"entry_fee_tournament_creator\" }\n | { kind: \"entry_fee_game_creator\" }\n | { kind: \"entry_fee_protocol_fee\" }\n | { kind: \"entry_fee_refund\"; tokenId: string }\n | {\n kind: \"entry_fee_extension\";\n /**\n * Game token claiming the fee-pool share, or undefined for\n * non-claim flows (sponsor refunds, creator shares, etc.).\n */\n tokenId?: string;\n claimParams: string[];\n };\n\n// ---------------------------------------------------------------------------\n// ERC20\n// ---------------------------------------------------------------------------\n\n/** Standard ERC20 `approve(spender, amount)` call. */\nexport function buildErc20ApproveCall(\n tokenAddress: string,\n spender: string,\n amount: string,\n): Call {\n return {\n contractAddress: tokenAddress,\n entrypoint: \"approve\",\n calldata: CallData.compile([spender, uint256.bnToUint256(amount)]),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Budokan entrypoints\n// ---------------------------------------------------------------------------\n\n/**\n * `enter_tournament(tournament_id: u64, player_name: Option<felt252>,\n * player_address: Option<ContractAddress>,\n * qualifier: Option<ContractAddress>,\n * qualification: Option<QualificationProof>,\n * entry_fee_pay_params: Option<Span<felt252>>,\n * salt: u16, metadata_value: u16)`\n *\n * Targets the current budokan contract (#264/#269). `qualification` and\n * `entry_fee_pay_params` are always `None` here — gated/extension-fee\n * tournaments need a real proof / pay-params payload, which depend on the\n * validator and the caller's runtime state.\n *\n * Returns `(felt252, u32)` on-chain — game_token_id and entry_number — but\n * `execute()` surfaces only the tx hash. Callers can fetch the receipt\n * and parse events if they need the values.\n *\n * Tournaments with a non-trivial entry_requirement (NFT-gated or\n * extension-validator) need a real `QualificationProof` and shouldn't go\n * through this entrypoint — route those via the budokan client UI or\n * implement a qualification-proof builder.\n */\nexport function buildEnterTournamentCall(\n budokanAddress: string,\n args: EnterTournamentArgs,\n): Call {\n // Hand-built calldata. enter_tournament takes a chain of Options (tags:\n // 0 = Some, 1 = None) in this exact ABI order:\n // tournament_id, player_name?, player_address?, qualifier?,\n // qualification?, entry_fee_pay_params?, salt, metadata_value\n const calldata: string[] = [\n num.toHex(args.tournamentId), // tournament_id u64\n ];\n // player_name: Option<felt252>\n if (args.playerName) {\n calldata.push(\"0x0\", felt252FromShortString(args.playerName));\n } else {\n calldata.push(\"0x1\");\n }\n // player_address: Option<ContractAddress> — Some(addr) sets the mint\n // recipient; None defaults to the caller.\n if (args.playerAddress) {\n calldata.push(\"0x0\", args.playerAddress);\n } else {\n calldata.push(\"0x1\");\n }\n // qualifier: Option<ContractAddress> — Some(addr) claims a third-party\n // qualifier; None = caller is the qualifier.\n if (args.qualifier) {\n calldata.push(\"0x0\", args.qualifier);\n } else {\n calldata.push(\"0x1\");\n }\n // qualification: Option<QualificationProof> — only None is supported here.\n // Token / extension qualified tournaments require a real proof, which\n // depends on the validator and on the caller's runtime state.\n calldata.push(\"0x1\");\n // entry_fee_pay_params: Option<Span<felt252>>. Some(span) for\n // EntryFeeKind::Extension tournaments; None for the built-in fee flow.\n if (args.entryFeePayParams && args.entryFeePayParams.length > 0) {\n calldata.push(\n \"0x0\",\n num.toHex(args.entryFeePayParams.length),\n ...args.entryFeePayParams,\n );\n } else {\n calldata.push(\"0x1\");\n }\n calldata.push(num.toHex(args.salt ?? 0)); // salt u16\n calldata.push(num.toHex(args.metadataValue ?? 0)); // metadata_value u16\n return {\n contractAddress: budokanAddress,\n entrypoint: \"enter_tournament\",\n calldata,\n };\n}\n\n/** `submit_score(tournament_id: u64, token_id: felt252, position: u32)` */\nexport function buildSubmitScoreCall(\n budokanAddress: string,\n args: { tournamentId: string; tokenId: string; position: number },\n): Call {\n return {\n contractAddress: budokanAddress,\n entrypoint: \"submit_score\",\n calldata: CallData.compile([args.tournamentId, args.tokenId, args.position]),\n };\n}\n\n/** `claim_reward(tournament_id: u64, reward_type: RewardType)` */\nexport function buildClaimRewardCall(\n budokanAddress: string,\n args: { tournamentId: string; reward: RewardType },\n): Call {\n // Hand-rolled enum encoding: outer tag, then inner tag, then payload.\n // CallData.compile flattens nested arrays, so we build the felt list\n // directly to keep this transparent.\n const calldata: string[] = [num.toHex(args.tournamentId)];\n pushRewardTypeFelts(calldata, args.reward);\n return {\n contractAddress: budokanAddress,\n entrypoint: \"claim_reward\",\n calldata,\n };\n}\n\n/**\n * `create_tournament(creator_rewards_address, metadata, schedule,\n * game_config, entry_fee, entry_requirement,\n * leaderboard_config, salt, metadata_value)`\n *\n * Schedule fields are durations (`registration_end_delay`,\n * `game_end_delay` measured from their respective starts) — *not*\n * absolute offsets from creation. Callers are responsible for the\n * arithmetic; the contract validates min/max bounds itself.\n *\n * Pass `entryFee` / `entryRequirement` as `undefined` for free / open\n * tournaments. Both fields are wrapped in `CairoOption` so\n * `CallData.compile` emits the correct variant tag.\n */\nexport function buildCreateTournamentCall(\n budokanAddress: string,\n args: CreateTournamentArgs,\n): Call {\n const calldata = CallData.compile({\n creator_rewards_address: args.creatorRewardsAddress,\n metadata: {\n // name is a felt252 (≤31 ASCII bytes). starknet.js packs short\n // ASCII strings into a single felt automatically.\n name: args.name,\n // description is a Cairo ByteArray (multi-felt: data words +\n // pending word + pending word length). A plain JS string serializes\n // to a single felt and the deserializer reverts — wrap explicitly.\n description: byteArray.byteArrayFromString(args.description),\n },\n schedule: {\n registration_start_delay: args.schedule.registrationStartDelay,\n registration_end_delay: args.schedule.registrationEndDelay,\n game_start_delay: args.schedule.gameStartDelay,\n game_end_delay: args.schedule.gameEndDelay,\n submission_duration: args.schedule.submissionDuration,\n },\n game_config: {\n game_address: args.gameAddress,\n settings_id: args.settingsId,\n soulbound: false,\n paymaster: false,\n // Options must be CairoOption — see file header for why.\n client_url: new CairoOption<string>(CairoOptionVariant.None),\n renderer: new CairoOption<string>(CairoOptionVariant.None),\n },\n entry_fee: encodeEntryFeeOption(args.entryFee),\n entry_requirement: encodeEntryRequirementOption(args.entryRequirement),\n leaderboard_config: {\n ascending: args.leaderboard.ascending,\n game_must_be_over: args.leaderboard.gameMustBeOver,\n },\n salt: args.salt ?? 0,\n metadata_value: args.metadataValue ?? 0,\n });\n return {\n contractAddress: budokanAddress,\n entrypoint: \"create_tournament\",\n calldata,\n };\n}\n\n/**\n * `add_prize(tournament_id: u64, prize: Prize, position: Option<u32>) -> u64`\n *\n * The `Prize` sum type discriminates between the built-in\n * (ERC20/ERC721) flow and an external `IPrizeExtension` integration —\n * see `PrizeSpec` for the variants.\n *\n * The on-chain entrypoint returns the minted `prize_id` (u64); callers\n * wanting the full payload should subscribe to the `PrizeAdded` event.\n */\nexport function buildAddPrizeCall(\n budokanAddress: string,\n args: AddPrizeArgs,\n): Call {\n const prize = encodePrize(args.prize);\n const position =\n args.prize.kind === \"token\" && args.prize.position !== undefined\n ? new CairoOption<number>(CairoOptionVariant.Some, args.prize.position)\n : new CairoOption<number>(CairoOptionVariant.None);\n const calldata = CallData.compile({\n tournament_id: args.tournamentId,\n prize,\n position,\n });\n return {\n contractAddress: budokanAddress,\n entrypoint: \"add_prize\",\n calldata,\n };\n}\n\nfunction encodePrize(spec: PrizeSpec): CairoCustomEnum {\n // Variant order from interfaces::prize::Prize: Token, Extension.\n // Input payloads (TokenPrizePayload / ExtensionPrizePayload) carry no\n // host-assigned metadata — id/context_id/sponsor_address live on the\n // wrapping PrizeRecord at read time and are filled in by the host.\n if (spec.kind === \"token\") {\n return new CairoCustomEnum({\n Token: {\n token_address: spec.tokenAddress,\n token_type: encodeTokenType(spec.tokenType),\n },\n Extension: undefined,\n });\n }\n // ExtensionPrizePayload { address, config }. CallData.compile\n // serializes string[] as a Span (len + items).\n return new CairoCustomEnum({\n Token: undefined,\n Extension: {\n address: spec.address,\n config: spec.config,\n },\n });\n}\n\nfunction encodeTokenType(spec: TokenTypeSpec): CairoCustomEnum {\n if (spec.kind === \"erc20\") {\n // distribution and distribution_count must agree: a Some(distribution)\n // with a None count is ambiguous calldata that the contract rejects.\n if (spec.distribution && spec.distributionCount === undefined) {\n throw new Error(\n \"TokenTypeSpec.erc20: distributionCount is required when distribution is set\",\n );\n }\n // Inner erc20 data: { amount: u128, distribution: Option<Distribution>,\n // distribution_count: Option<u32> }. Both Options use CairoOption so\n // CallData.compile recognizes them as typed wrappers.\n //\n // Variant keys (`erc20`/`erc721`) match the ABI's TokenTypeData variant\n // names exactly, in declaration order. CallData.compile encodes the\n // variant by position (it's order-based without an ABI), so casing is\n // cosmetic for the wire format — but matching the ABI keeps the encoder\n // self-evidently correct and ABI-aware code paths safe.\n const distribution = spec.distribution\n ? new CairoOption<CairoCustomEnum>(\n CairoOptionVariant.Some,\n encodeDistribution(spec.distribution),\n )\n : new CairoOption<CairoCustomEnum>(CairoOptionVariant.None);\n const distributionCount =\n spec.distribution && spec.distributionCount !== undefined\n ? new CairoOption<number>(\n CairoOptionVariant.Some,\n spec.distributionCount,\n )\n : new CairoOption<number>(CairoOptionVariant.None);\n return new CairoCustomEnum({\n erc20: {\n amount: spec.amount,\n distribution,\n distribution_count: distributionCount,\n },\n erc721: undefined,\n });\n }\n return new CairoCustomEnum({\n erc20: undefined,\n erc721: { id: spec.tokenId },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Internal encoders\n// ---------------------------------------------------------------------------\n\ninterface EntryFeePayload {\n token_address: string;\n amount: string;\n tournament_creator_share: number;\n game_creator_share: number;\n refund_share: number;\n distribution: CairoCustomEnum;\n distribution_count: number;\n}\n\nfunction encodeEntryFeeOption(\n fee: EntryFeeArgs | undefined,\n): CairoOption<CairoCustomEnum> {\n if (!fee) return new CairoOption<CairoCustomEnum>(CairoOptionVariant.None);\n const builtIn: EntryFeePayload = {\n token_address: fee.tokenAddress,\n amount: fee.amount,\n tournament_creator_share: fee.tournamentCreatorShare,\n game_creator_share: fee.gameCreatorShare,\n refund_share: fee.refundShare,\n distribution: encodeDistribution(fee.distribution),\n distribution_count: fee.distributionCount,\n };\n // entry_fee is now Option<EntryFeeKind>, where EntryFeeKind is a sum type\n // { BuiltIn: EntryFee, Extension: ExtensionConfig }. The SDK only builds\n // built-in token fees; wrap the payload in the BuiltIn variant.\n return new CairoOption<CairoCustomEnum>(\n CairoOptionVariant.Some,\n new CairoCustomEnum({ BuiltIn: builtIn, Extension: undefined }),\n );\n}\n\ninterface EntryRequirementPayload {\n entry_limit: number;\n entry_requirement_type: CairoCustomEnum;\n}\n\nfunction encodeEntryRequirementOption(\n req: EntryRequirementArgs | undefined,\n): CairoOption<EntryRequirementPayload> {\n if (!req)\n return new CairoOption<EntryRequirementPayload>(CairoOptionVariant.None);\n return new CairoOption<EntryRequirementPayload>(CairoOptionVariant.Some, {\n entry_limit: req.entryLimit,\n entry_requirement_type: encodeEntryRequirementType(req.type),\n });\n}\n\nfunction encodeEntryRequirementType(\n spec: EntryRequirementSpec,\n): CairoCustomEnum {\n // Variant order from interfaces::entry_requirement::EntryRequirementType:\n // token: ContractAddress, extension: ExtensionConfig\n if (spec.kind === \"token\") {\n return new CairoCustomEnum({\n token: spec.tokenAddress,\n extension: undefined,\n });\n }\n if (spec.kind === \"extension\") {\n // ExtensionConfig { address: ContractAddress, config: Span<felt252> }.\n // CallData.compile serializes string[] as a Span (len + items).\n return new CairoCustomEnum({\n token: undefined,\n extension: {\n address: spec.address,\n config: spec.config,\n },\n });\n }\n throw new Error(\n `Unsupported entry requirement kind: ${(spec as { kind: string }).kind}`,\n );\n}\n\n// On-chain weight is `client weight * 10` (matches the budokan client's\n// formatting.ts convention so percentages match between tournaments\n// created via budokan.gg and via this SDK).\nfunction scaleWeight(client: number): number {\n return Math.round(client * 10);\n}\n\n/**\n * Encode the Distribution enum. Variant order in Cairo: Linear,\n * Exponential, Uniform, Custom — must match declaration order so\n * CallData.compile resolves the right tag. All variants are included\n * with `undefined` for inactive ones so CairoCustomEnum's \"exactly one\n * active variant\" invariant holds.\n */\nfunction encodeDistribution(d: DistributionSpec): CairoCustomEnum {\n if (d.kind === \"linear\") {\n return new CairoCustomEnum({\n Linear: scaleWeight(d.weight),\n Exponential: undefined,\n Uniform: undefined,\n Custom: undefined,\n });\n }\n if (d.kind === \"exponential\") {\n return new CairoCustomEnum({\n Linear: undefined,\n Exponential: scaleWeight(d.weight),\n Uniform: undefined,\n Custom: undefined,\n });\n }\n // Uniform has no payload. CallData.compile emits just the variant tag\n // when unwrap() returns an empty object.\n return new CairoCustomEnum({\n Linear: undefined,\n Exponential: undefined,\n Uniform: {},\n Custom: undefined,\n });\n}\n\nfunction pushRewardTypeFelts(out: string[], reward: RewardType): void {\n // Outer tags: RewardType { Prize=0, EntryFee=1 }\n // Prize inner: PrizeClaim { Token=0, Extension=1 }\n // PrizeClaim::Token inner: PrizeType { Single=0, Distributed=1 }\n // EntryFee inner: EntryFeeClaim { Token=0, Extension=1 }\n // EntryFeeClaim::Token inner: EntryFeeRewardType { Position=0,\n // TournamentCreator=1, GameCreator=2, Refund=3, ProtocolFee=4 }\n switch (reward.kind) {\n case \"prize_single\":\n out.push(\"0x0\", \"0x0\", \"0x0\", num.toHex(reward.prizeId));\n return;\n case \"prize_distributed\":\n out.push(\n \"0x0\",\n \"0x0\",\n \"0x1\",\n num.toHex(reward.prizeId),\n num.toHex(reward.payoutPosition),\n );\n return;\n case \"prize_extension\":\n // ExtensionPrizeClaim { prize_id, token_id: Option<felt252>, payout_params }\n out.push(\"0x0\", \"0x1\", num.toHex(reward.prizeId));\n if (reward.tokenId !== undefined) {\n out.push(\"0x0\", reward.tokenId); // Some(token_id)\n } else {\n out.push(\"0x1\"); // None\n }\n out.push(\n num.toHex(reward.payoutParams.length),\n ...reward.payoutParams.map((p) => num.toHex(p)),\n );\n return;\n case \"entry_fee_position\":\n out.push(\"0x1\", \"0x0\", \"0x0\", num.toHex(reward.position));\n return;\n case \"entry_fee_tournament_creator\":\n out.push(\"0x1\", \"0x0\", \"0x1\");\n return;\n case \"entry_fee_game_creator\":\n out.push(\"0x1\", \"0x0\", \"0x2\");\n return;\n case \"entry_fee_refund\":\n out.push(\"0x1\", \"0x0\", \"0x3\", num.toHex(reward.tokenId));\n return;\n case \"entry_fee_protocol_fee\":\n out.push(\"0x1\", \"0x0\", \"0x4\");\n return;\n case \"entry_fee_extension\": {\n // ExtensionEntryFeeClaim { token_id: Option<felt252>, claim_params }\n out.push(\"0x1\", \"0x1\");\n if (reward.tokenId !== undefined) {\n out.push(\"0x0\", reward.tokenId); // Some(token_id)\n } else {\n out.push(\"0x1\"); // None\n }\n out.push(\n num.toHex(reward.claimParams.length),\n ...reward.claimParams.map((p) => num.toHex(p)),\n );\n return;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Event parsing helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal receipt shape — `events: Array<{ from_address, keys, ... }>`\n * is all `parseTournamentIdFromReceipt` needs and matches what every\n * Starknet RPC / starknet.js `waitForTransaction` returns.\n */\nexport interface ReceiptWithEvents {\n events?: Array<{ from_address?: string; keys?: string[] }>;\n}\n\nconst TOURNAMENT_CREATED_SELECTOR = hash.getSelectorFromName(\n \"TournamentCreated\",\n);\n\n/**\n * Extract the new tournament's id from a `create_tournament` tx receipt\n * by scanning for the `TournamentCreated` event emitted by the budokan\n * contract. The event has the tournament id in its first indexed key\n * (`keys[1]` — `keys[0]` is the selector).\n *\n * Returns the id as a `bigint` (the on-chain type is `u64`, which exceeds\n * JS `Number.MAX_SAFE_INTEGER`, so a lossless type is required — callers\n * deep-linking to a tournament page should `.toString()` it). Returns\n * `undefined` if no matching event is found (e.g. the receipt came from a\n * different call, or the budokan address didn't match).\n *\n * Caller is responsible for fetching the receipt — typically via\n * `account.waitForTransaction(hash)` or `provider.waitForTransaction(hash)`.\n */\nexport function parseTournamentIdFromReceipt(\n receipt: ReceiptWithEvents,\n budokanAddress: string,\n): bigint | undefined {\n const normalise = (addr: string) =>\n addr.toLowerCase().replace(/^0x0*/, \"0x\");\n const normContract = normalise(budokanAddress);\n // Compare selectors numerically so RPC formatting differences\n // (leading-zero padding, casing) don't cause a valid event to be missed.\n const createdSelector = BigInt(TOURNAMENT_CREATED_SELECTOR);\n for (const event of receipt.events ?? []) {\n if (!event.from_address || !event.keys || event.keys.length < 2) continue;\n if (normalise(event.from_address) !== normContract) continue;\n if (BigInt(event.keys[0]!) !== createdSelector) continue;\n return BigInt(event.keys[1]!);\n }\n return undefined;\n}\n\n// Felt252 short-string encoding: ASCII bytes packed big-endian into a felt.\n// Throws if the input is too long (>31 bytes) or non-ASCII.\nfunction felt252FromShortString(s: string): string {\n if (s.length > 31)\n throw new Error(`String too long for felt252: ${s.length} bytes`);\n let value = 0n;\n for (const char of s) {\n const code = char.charCodeAt(0);\n if (code > 0x7f) throw new Error(\"Felt252 short strings must be ASCII\");\n value = (value << 8n) | BigInt(code);\n }\n return \"0x\" + value.toString(16);\n}\n","/**\n * Pure distribution + entry-fee math for Budokan.\n *\n * This module is the single source of truth for \"how much does position N\n * get?\" — the same arithmetic the budokan client used to duplicate in\n * `computeEntryFeeAmount` / `computePrizePercentages` / `processEntryFeePrizes`.\n *\n * All functions are pure: no I/O, no contract calls, no `Date.now()`. Token\n * amounts are `bigint` in smallest token units; basis-point shares are plain\n * numbers (0–10000). USD conversion, decimals, and formatting stay in the\n * consumer.\n *\n * Distribution percentages are computed with the shared `calculateDistribution`\n * from `@provable-games/metagame-sdk` — the *exact* function the budokan client\n * renders payouts with — so amounts match between the SDK, budokan.gg, and any\n * third-party integration. (The final on-chain claim amount is computed by the\n * contract's fixed-point math; these values are the canonical client-side\n * estimate, suitable for display and for filtering unclaimable zero slices.)\n *\n * Entry-fee split semantics follow the contract\n * (`packages/rewards/src/budokan_rewards.cairo::_claim_entry_fee_position`):\n * the position pool is the entry-fee pool **minus** the tournament-creator,\n * game-creator, refund, *and protocol-fee* shares. The client historically\n * omitted the protocol fee here and over-counted the position pool — this\n * module fixes that by taking `protocolFeeShare` as an explicit input.\n */\n\nimport type { Prize } from \"../types/prize.js\";\n\nconst BASIS_POINTS = 10000n;\n\ntype CurveType = \"linear\" | \"exponential\" | \"uniform\";\n\n/**\n * Per-position basis-point curve → percentages (0–100). Ported verbatim from\n * `@provable-games/metagame-sdk`'s `calculateDistribution` (the function the\n * budokan client renders payouts with) so the SDK has no runtime dependency on\n * it and stays the single source of truth. `weight` is in client units (the\n * caller divides the on-chain ×10 weight before passing it here); the\n * normalized rounding dust is rolled into position 1, exactly as on the client.\n */\nfunction calculateDistribution(\n positions: number,\n weight: number,\n distributionType: CurveType,\n): number[] {\n if (positions <= 0) return [];\n\n let raw: number[];\n if (distributionType === \"uniform\") {\n raw = Array(positions).fill(1);\n } else if (distributionType === \"linear\") {\n raw = [];\n for (let i = 0; i < positions; i++) {\n const positionValue = positions - i;\n raw.push(1 + (positionValue - 1) * (weight / 10));\n }\n } else {\n raw = [];\n for (let i = 0; i < positions; i++) {\n raw.push(Math.pow(1 - i / positions, weight));\n }\n }\n\n const total = raw.reduce((a, b) => a + b, 0);\n if (total === 0) return Array(positions).fill(0);\n\n const bpShares = raw.map((d) => Math.floor((d / total) * 1e4));\n const remaining = 1e4 - bpShares.reduce((a, b) => a + b, 0);\n if (remaining !== 0) bpShares[0] = bpShares[0]! + remaining;\n return bpShares.map((bp) => bp / 100);\n}\n\nexport type DistributionKind =\n | \"linear\"\n | \"exponential\"\n | \"uniform\"\n | \"custom\"\n | \"unknown\";\n\nexport interface ParsedDistribution {\n type: DistributionKind;\n /**\n * Raw weight as stored on-chain (scaled ×10 — e.g. `10` = 1.0). `0` for\n * Uniform/Custom. `distributionPercentages` divides by 10 internally.\n */\n weight: number;\n /** For Custom distributions, the raw u16 basis-point shares (one per paid position). */\n customWeights?: number[];\n}\n\nconst KNOWN_KEYS: Record<string, DistributionKind> = {\n linear: \"linear\",\n exponential: \"exponential\",\n uniform: \"uniform\",\n custom: \"custom\",\n};\n\n/**\n * Normalize the many wire shapes of the Cairo `Distribution` enum into a flat\n * `{ type, weight, customWeights }`. Handles:\n * - starknet.js v9 CairoCustomEnum: `{ variant: { Exponential: 100 } }`\n * - SDK / PascalCase: `{ Exponential: 100 }`\n * - lower-cased JSON (indexer/API): `{ exponential: 100 }`\n * - explicit `{ type, weight }`\n * - `Option`-wrapped weights (`{ Some: n }`)\n *\n * Unknown / missing input → `{ type: \"unknown\", weight: 0 }`, which\n * `distributionPercentages` treats as Uniform.\n */\nexport function parseDistribution(dist: unknown): ParsedDistribution {\n if (!dist || typeof dist !== \"object\") {\n return { type: \"unknown\", weight: 0 };\n }\n\n // `{ type, weight }` explicit shape\n const explicit = dist as { type?: string; weight?: number | string };\n if (typeof explicit.type === \"string\") {\n const kind = KNOWN_KEYS[explicit.type.toLowerCase()] ?? \"unknown\";\n return { type: kind, weight: Number(explicit.weight ?? 0) };\n }\n\n // Unwrap a CairoCustomEnum `.variant` layer if present.\n const bag = ((dist as { variant?: Record<string, unknown> }).variant ??\n (dist as Record<string, unknown>)) as Record<string, unknown>;\n\n for (const [rawKey, value] of Object.entries(bag)) {\n if (value === undefined || value === null) continue;\n const kind = KNOWN_KEYS[rawKey.toLowerCase()];\n if (!kind) continue;\n\n if (kind === \"uniform\") return { type: \"uniform\", weight: 0 };\n\n if (kind === \"custom\") {\n const arr = Array.isArray(value) ? value.map((v) => Number(v)) : [];\n return { type: \"custom\", weight: 0, customWeights: arr };\n }\n\n // Linear / Exponential carry a numeric weight.\n if (typeof value === \"number\" || typeof value === \"string\" || typeof value === \"bigint\") {\n return { type: kind, weight: Number(value) };\n }\n if (typeof value === \"object\" && value !== null && \"Some\" in value) {\n return { type: kind, weight: Number((value as { Some: unknown }).Some) };\n }\n return { type: kind, weight: 0 };\n }\n\n return { type: \"unknown\", weight: 0 };\n}\n\n/**\n * Build a `ParsedDistribution` from the flat fields the SDK carries on a\n * sponsored `Prize` (`distributionType` / `distributionWeight` /\n * `distributionShares`).\n */\nexport function prizeDistribution(prize: Pick<\n Prize,\n \"distributionType\" | \"distributionWeight\" | \"distributionShares\"\n>): ParsedDistribution {\n const type = KNOWN_KEYS[String(prize.distributionType ?? \"uniform\").toLowerCase()] ?? \"uniform\";\n if (type === \"custom\") {\n return { type, weight: 0, customWeights: prize.distributionShares ?? [] };\n }\n // Default weight matches the client (10 → 1.0) when missing.\n return { type, weight: prize.distributionWeight ?? 10 };\n}\n\n/**\n * Per-position percentages (each 0–100, summing to ~100) for a distribution\n * across `count` paid positions. Generalizes the client's\n * `computeEntryFeePercentages` / `computePrizePercentages`.\n *\n * - linear/exponential: delegates to metagame-sdk's `calculateDistribution`\n * (weight is divided by 10 to undo the on-chain ×10 scaling).\n * - uniform / unknown: equal split.\n * - custom: raw basis-point shares ÷ 100; falls back to uniform when the\n * shares array length doesn't match `count`.\n */\nexport function distributionPercentages(\n dist: ParsedDistribution,\n count: number,\n): number[] {\n if (count <= 0) return [];\n\n if (dist.type === \"custom\") {\n const cw = dist.customWeights ?? [];\n if (cw.length === count) return cw.map((bp) => bp / 100);\n return calculateDistribution(count, 1, \"uniform\");\n }\n\n const distType: CurveType =\n dist.type === \"linear\" || dist.type === \"exponential\" || dist.type === \"uniform\"\n ? dist.type\n : \"uniform\";\n // Weight is stored ×10 on-chain; `calculateDistribution` expects client units.\n return calculateDistribution(count, dist.weight / 10, distType);\n}\n\n/** Input shape for entry-fee split math. Mirrors the on-chain built-in `EntryFee`\n * plus the per-tournament protocol-fee snapshot (carried on `Tournament`). */\nexport interface EntryFeeSplitInput {\n /** Per-entry fee in smallest token units (decimal string or bigint). */\n amount: string | bigint;\n /** Number of paid entries collected. */\n entryCount: number;\n /** Basis-point shares (0–10000). Omitted / null → 0. */\n tournamentCreatorShare?: number | null;\n gameCreatorShare?: number | null;\n refundShare?: number | null;\n /** Protocol-fee bps snapshotted for the tournament (`Tournament.protocolFeeShare`). */\n protocolFeeShare?: number | null;\n}\n\nexport interface EntryFeeSplit {\n /** Total fee pool = amount × entryCount. */\n total: bigint;\n /** Pool shared across leaderboard positions = floor(availableShare × total / 10000). */\n positionPool: bigint;\n tournamentCreator: bigint;\n gameCreator: bigint;\n refund: bigint;\n protocolFee: bigint;\n /** Basis points left for positions after fixed shares (clamped ≥ 0). */\n availableShareBps: number;\n}\n\nfunction bps(total: bigint, share: number | null | undefined): bigint {\n const b = Number(share ?? 0);\n if (b <= 0) return 0n;\n return (total * BigInt(b)) / BASIS_POINTS;\n}\n\n/**\n * Split a built-in entry-fee pool into its on-chain components. The position\n * pool reserves the tournament-creator, game-creator, refund, *and* protocol\n * fee — matching `_claim_entry_fee_position`'s `available_share`.\n *\n * Note: each component is floored independently (sub-wei dust may not sum to\n * `total`, exactly as on-chain).\n */\nexport function entryFeeSplit(input: EntryFeeSplitInput): EntryFeeSplit {\n const total = BigInt(input.amount ?? 0) * BigInt(input.entryCount ?? 0);\n const creator = Number(input.tournamentCreatorShare ?? 0);\n const game = Number(input.gameCreatorShare ?? 0);\n const refund = Number(input.refundShare ?? 0);\n const protocol = Number(input.protocolFeeShare ?? 0);\n const availableShareBps = Math.max(0, 10000 - creator - game - refund - protocol);\n return {\n total,\n positionPool: (total * BigInt(availableShareBps)) / BASIS_POINTS,\n tournamentCreator: bps(total, creator),\n gameCreator: bps(total, game),\n refund: bps(total, refund),\n protocolFee: bps(total, protocol),\n availableShareBps,\n };\n}\n\n/** The on-chain `EntryFee` distribution shape this module needs to size a\n * position payout. A superset of `EntryFeeSplitInput`. */\nexport interface EntryFeePositionInput extends EntryFeeSplitInput {\n /** Raw on-chain `Distribution` (any wire shape — parsed internally). */\n distribution: unknown;\n /** Number of paid positions (`distribution_count`). */\n distributionCount: number;\n}\n\n/**\n * Amount a single leaderboard `position` (1-indexed) claims from the entry-fee\n * pool. Generalizes the client's `computeEntryFeeAmount` — and fixes its\n * protocol-fee over-count by reserving `protocolFeeShare`.\n *\n * Returns `0n` when the position is outside the paid range, the pool is empty,\n * or the share rounds to zero (the contract makes such positions unclaimable).\n */\nexport function entryFeePositionPayout(\n input: EntryFeePositionInput,\n position: number,\n): bigint {\n const distCount = Number(input.distributionCount ?? 0);\n if (distCount <= 0 || position < 1 || position > distCount) return 0n;\n\n const split = entryFeeSplit(input);\n if (split.positionPool <= 0n) return 0n;\n\n const pcts = distributionPercentages(parseDistribution(input.distribution), distCount);\n const pct = pcts[position - 1] ?? 0;\n if (pct <= 0) return 0n;\n // Carry 4 extra decimals on pct so 0.0001% slices don't vanish (matches client).\n return (split.positionPool * BigInt(Math.floor(pct * 10000))) / 1_000_000n;\n}\n\n/**\n * Amount a single `position` (1-indexed) claims from a distributed sponsored\n * ERC20 prize. Generalizes the client's per-position `computePrizePercentages`\n * + amount slicing. Returns `0n` for non-distributed / non-ERC20 prizes, a\n * position outside the paid range, or a zero slice.\n */\nexport function sponsorPrizePayout(prize: Prize, position: number): bigint {\n if (prize.tokenType !== \"erc20\") return 0n;\n const distCount = Number(prize.distributionCount ?? 0);\n if (distCount <= 0 || position < 1 || position > distCount) return 0n;\n\n const pcts = distributionPercentages(prizeDistribution(prize), distCount);\n const pct = pcts[position - 1] ?? 0;\n if (pct <= 0) return 0n;\n return (BigInt(prize.amount ?? \"0\") * BigInt(Math.floor(pct * 10000))) / 1_000_000n;\n}\n","/**\n * Player reward resolution — \"which rewards can this player still claim, and\n * what `claim_reward` calls assemble them?\"\n *\n * Generalizes the budokan client's `buildPlayerClaimCalls` + `computeEarnings`\n * + `getClaimablePrizes`. Pure: walks placements + prize/entry-fee data +\n * existing claims and returns not-yet-claimed, non-zero rewards plus the\n * `Call`s to claim them (via the tested `buildClaimRewardCall` encoder — so\n * the claim-encoding bug class the SDK was created to kill can't recur).\n *\n * Scope (matches the client): the connected player's own placements only —\n * entry-fee position prizes + sponsored prizes. Creator shares, protocol fee,\n * and per-token refunds are pool/owner concerns, not placement-derived, and\n * are intentionally excluded.\n */\n\nimport { buildClaimRewardCall } from \"../calldata/index.js\";\nimport type { Call, RewardType } from \"../calldata/index.js\";\nimport { entryFeePositionPayout, sponsorPrizePayout } from \"../distribution/index.js\";\nimport { isRawTokenPrize } from \"../utils/prizes.js\";\nimport type { Tournament } from \"../types/tournament.js\";\nimport type { Prize, RewardClaim } from \"../types/prize.js\";\nimport type { PlayerPlacement } from \"../types/player.js\";\n\nexport type ClaimableRewardSource =\n | \"entry_fee_position\"\n | \"sponsor_single\"\n | \"sponsor_distributed\";\n\nexport interface ClaimableReward {\n tournamentId: string;\n /** Human label for UI/telemetry (`tournament.name` or `#id`). */\n tournamentName: string;\n /** Reward descriptor — feed straight to `buildClaimRewardCall` / `buildClaimCalls`. */\n reward: RewardType;\n /** Where the reward comes from (UI grouping / telemetry). */\n source: ClaimableRewardSource;\n /** 1-indexed leaderboard position the reward is for. */\n position: number;\n /** Token contract (ERC20/ERC721). */\n tokenAddress: string | null;\n tokenType: \"erc20\" | \"erc721\";\n /** ERC20 amount in smallest units; `undefined` for ERC721 (one NFT). */\n amount?: bigint;\n /** ERC721 token id, when applicable. */\n tokenId?: string | null;\n}\n\nexport interface GetClaimableRewardsInput {\n placements: PlayerPlacement[];\n tournaments: Tournament[];\n prizes: Prize[];\n /** Existing reward-claim records. Only those with `claimed === true` filter rewards out. */\n existingClaims: RewardClaim[];\n}\n\n/**\n * The not-yet-claimed, non-zero rewards across the player's placements.\n *\n * Skips:\n * - already-claimed rewards (would revert),\n * - 0-amount ERC20 slices (contract truncation makes them unclaimable),\n * - creator/protocol/refund shares (not placement-derived).\n */\nexport function getClaimableRewards(\n input: GetClaimableRewardsInput,\n): ClaimableReward[] {\n const tournamentsById = new Map<string, Tournament>();\n for (const t of input.tournaments) tournamentsById.set(t.id, t);\n\n const prizesByTournament = new Map<string, Prize[]>();\n for (const p of input.prizes) {\n let list = prizesByTournament.get(p.tournamentId);\n if (!list) prizesByTournament.set(p.tournamentId, (list = []));\n list.push(p);\n }\n\n // O(1) \"is this (tournament, reward) already claimed?\" lookup.\n const claimedKeys = new Set<string>();\n for (const c of input.existingClaims) {\n if (!c.claimed) continue;\n const key = rewardClaimKey(c);\n if (key) claimedKeys.add(`${c.tournamentId}:${key}`);\n }\n\n const out: ClaimableReward[] = [];\n\n for (const placement of input.placements) {\n const tournament = tournamentsById.get(placement.tournamentId);\n if (!tournament) continue;\n const tournamentName = tournament.name || `#${tournament.id}`;\n const pos = placement.position;\n\n // ---- Entry-fee position prize ----\n const ef = tournament.entryFee;\n const efDistCount = Number(ef?.distributionCount ?? 0);\n if (ef && ef.tokenAddress && efDistCount >= pos) {\n const claimKey = `${placement.tournamentId}:EntryFee.Position.${pos}`;\n if (!claimedKeys.has(claimKey)) {\n const amount = entryFeePositionPayout(\n {\n amount: ef.amount ?? \"0\",\n entryCount: tournament.entryCount ?? 0,\n tournamentCreatorShare: ef.tournamentCreatorShare,\n gameCreatorShare: ef.gameCreatorShare,\n refundShare: ef.refundShare,\n protocolFeeShare: tournament.protocolFeeShare,\n distribution: ef.distribution,\n distributionCount: efDistCount,\n },\n pos,\n );\n if (amount > 0n) {\n out.push({\n tournamentId: placement.tournamentId,\n tournamentName,\n source: \"entry_fee_position\",\n position: pos,\n tokenAddress: ef.tokenAddress,\n tokenType: \"erc20\",\n amount,\n reward: { kind: \"entry_fee_position\", position: pos },\n });\n }\n }\n }\n\n // ---- Sponsor prizes at this position ----\n for (const prize of prizesByTournament.get(placement.tournamentId) ?? []) {\n // `isRawTokenPrize` (not `isTokenPrize`): distributed prizes legitimately\n // carry `payoutPosition === 0`, which the hydrated `isTokenPrize` guard\n // would reject — dropping every distributed sponsor reward.\n if (!isRawTokenPrize(prize)) continue;\n\n const dc = prize.distributionCount ?? 0;\n const pp = prize.payoutPosition ?? 0;\n const isSingle = pp === pos && dc === 0;\n const isDistributed = dc >= pos && pp === 0;\n if (!isSingle && !isDistributed) continue;\n\n const tokenType: \"erc20\" | \"erc721\" =\n prize.tokenType === \"erc721\" ? \"erc721\" : \"erc20\";\n\n if (isSingle) {\n const claimKey = `${placement.tournamentId}:Prize.Single.${prize.prizeId}`;\n if (claimedKeys.has(claimKey)) continue;\n out.push({\n tournamentId: placement.tournamentId,\n tournamentName,\n source: \"sponsor_single\",\n position: pos,\n tokenAddress: prize.tokenAddress,\n tokenType,\n amount: tokenType === \"erc20\" ? BigInt(prize.amount ?? \"0\") : undefined,\n tokenId: prize.tokenId,\n reward: { kind: \"prize_single\", prizeId: prize.prizeId },\n });\n continue;\n }\n\n // Distributed: ERC20 only (the contract only distributes fungibles).\n // The on-chain `payout_index` is 1-indexed and equals the leaderboard\n // position: `_claim_distributed_prize` asserts `payout_index > 0` and\n // reads leaderboard slot `payout_index - 1`. The indexer stores the same\n // 1-indexed value on the claim record (decoder reads it verbatim), so the\n // claim key matches on `pos`, not `pos - 1`.\n const payoutIndex = pos;\n const claimKey = `${placement.tournamentId}:Prize.Distributed.${prize.prizeId}.${payoutIndex}`;\n if (claimedKeys.has(claimKey)) continue;\n const amount = sponsorPrizePayout(prize, pos);\n if (amount <= 0n) continue; // 0-slice → unclaimable on-chain\n out.push({\n tournamentId: placement.tournamentId,\n tournamentName,\n source: \"sponsor_distributed\",\n position: pos,\n tokenAddress: prize.tokenAddress,\n tokenType: \"erc20\",\n amount,\n reward: {\n kind: \"prize_distributed\",\n prizeId: prize.prizeId,\n payoutPosition: payoutIndex,\n },\n });\n }\n }\n\n return out;\n}\n\n/**\n * Turn resolved {@link ClaimableReward}s into `claim_reward` `Call`s for\n * `account.execute([...])`. Order is preserved.\n */\nexport function buildClaimCalls(\n rewards: ClaimableReward[],\n budokanAddress: string,\n): Call[] {\n return rewards.map((r) =>\n buildClaimRewardCall(budokanAddress, {\n tournamentId: r.tournamentId,\n reward: r.reward,\n }),\n );\n}\n\n/**\n * Composite key for the three placement-derived claim kinds the player cares\n * about (Prize::Single, Prize::Distributed, EntryFee::Position). Creator,\n * protocol-fee, and refund kinds aren't placement rewards → `null`.\n */\nfunction rewardClaimKey(c: RewardClaim): string | null {\n switch (c.claimKind) {\n case \"prize_single\":\n return c.prizeId ? `Prize.Single.${c.prizeId}` : null;\n case \"prize_distributed\":\n return c.prizeId != null && c.payoutIndex != null\n ? `Prize.Distributed.${c.prizeId}.${c.payoutIndex}`\n : null;\n case \"entry_fee_position\":\n return c.position != null ? `EntryFee.Position.${c.position}` : null;\n default:\n return null;\n }\n}\n","/**\n * Entry-requirement validator extensions.\n *\n * Thin wrappers on top of @provable-games/metagame-sdk for the four\n * validator presets we recommend for chat / bot integrations:\n *\n * - merkle — Allowlist of addresses via a pre-built merkle tree\n * - erc20Balance — Player must hold ≥ X of some ERC-20\n * - opusTroves — Player must have borrowed ≥ $X CASH on Opus\n * - tournament — Player must have entered / placed in a prior tournament\n *\n * Each `buildXxxConfig` function emits the `Span<felt252>` config array\n * the on-chain validator's `add_config` expects. Pair the array with the\n * validator address (via `extensionAddressFor`) when building an\n * `EntryRequirementArgs` of kind `\"extension\"`.\n *\n * Authoritative on-chain layouts:\n * metagame-extensions/packages/presets/src/entry_requirement/*.cairo\n *\n * u256 values (ERC-20 balance thresholds) are split into low/high felt\n * pairs to match those layouts. CASH amounts for Opus are passed as\n * single felts because they're u128-range in practice.\n */\n\nimport { getExtensionAddresses } from \"@provable-games/metagame-sdk\";\nimport type { WhitelistChain } from \"../games/whitelist.js\";\n\nexport type ExtensionPresetKind =\n | \"merkle\"\n | \"erc20Balance\"\n | \"opusTroves\"\n | \"tournament\";\n\n/** Map our short chain names to the chain IDs metagame-sdk uses. */\nfunction sdkChainId(chain: WhitelistChain): string {\n return chain === \"mainnet\" ? \"SN_MAIN\" : \"SN_SEPOLIA\";\n}\n\n/**\n * Lookup the deployed validator address for a given preset on a given\n * chain. Throws if the metagame-sdk address table doesn't have one — the\n * preset isn't usable on that chain.\n */\nexport function extensionAddressFor(\n chain: WhitelistChain,\n kind: ExtensionPresetKind,\n): string {\n const table = getExtensionAddresses(sdkChainId(chain));\n switch (kind) {\n case \"merkle\":\n if (!table.merkleValidator)\n throw new Error(`No merkleValidator address for ${chain}`);\n return table.merkleValidator;\n case \"erc20Balance\":\n if (!table.erc20BalanceValidator)\n throw new Error(`No erc20BalanceValidator address for ${chain}`);\n return table.erc20BalanceValidator;\n case \"opusTroves\":\n if (!table.opusTrovesValidator)\n throw new Error(`No opusTrovesValidator address for ${chain}`);\n return table.opusTrovesValidator;\n case \"tournament\":\n if (!table.tournamentValidator)\n throw new Error(`No tournamentValidator address for ${chain}`);\n return table.tournamentValidator;\n }\n}\n\nconst U256_MAX = (1n << 256n) - 1n;\n\n/** Split a u256 (as bigint) into [low_128, high_128] felt strings. */\nexport function u256ToLowHigh(value: bigint): [string, string] {\n if (value < 0n) throw new Error(\"u256 cannot be negative\");\n if (value > U256_MAX)\n throw new Error(`Value exceeds u256 max: ${value.toString()}`);\n const MASK = (1n << 128n) - 1n;\n return [(value & MASK).toString(), (value >> 128n).toString()];\n}\n\n// ---------------------------------------------------------------------------\n// ERC20 balance config\n// ---------------------------------------------------------------------------\n\nexport interface Erc20BalanceConfig {\n tokenAddress: string;\n /** Raw u256, smallest units. */\n minThreshold: bigint;\n /** Raw u256, smallest units; 0 = no max. */\n maxThreshold: bigint;\n /** Raw u256, smallest units; 0 = single entry, regardless of balance. */\n valuePerEntry: bigint;\n /** 0 = unlimited (only meaningful when valuePerEntry > 0). */\n maxEntries: number;\n bannable: boolean;\n}\n\n/**\n * Build the felt-string config array.\n *\n * Layout (from erc20_balance_validator.cairo):\n * [token, min_low, min_high, max_low, max_high, vpe_low, vpe_high,\n * max_entries, bannable]\n */\nexport function buildErc20BalanceConfig(cfg: Erc20BalanceConfig): string[] {\n const [minLo, minHi] = u256ToLowHigh(cfg.minThreshold);\n const [maxLo, maxHi] = u256ToLowHigh(cfg.maxThreshold);\n const [vpeLo, vpeHi] = u256ToLowHigh(cfg.valuePerEntry);\n return [\n cfg.tokenAddress,\n minLo, minHi,\n maxLo, maxHi,\n vpeLo, vpeHi,\n String(cfg.maxEntries),\n cfg.bannable ? \"1\" : \"0\",\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Opus Troves config\n// ---------------------------------------------------------------------------\n\nexport interface OpusTrovesConfig {\n /** Specific collateral filters; empty = wildcard (any trove qualifies). */\n assetAddresses: string[];\n /** Min CASH borrowed (raw, 18 decimals). CASH is 1:1 USD. */\n threshold: bigint;\n /** CASH per additional entry; 0 = single entry per qualifying trove. */\n valuePerEntry: bigint;\n /** 0 = unlimited (only meaningful with proportional valuePerEntry > 0). */\n maxEntries: number;\n bannable: boolean;\n}\n\n/**\n * Layout (from opus_troves_validator):\n * [asset_count, ...asset_addresses, threshold, value_per_entry,\n * max_entries, bannable]\n *\n * threshold / value_per_entry are CASH amounts (18 decimals, ≤ u128 range\n * for any reasonable USD value) — passed as single felts, not low/high\n * pairs. This matches the validator's parse (parseOpusTrovesValidatorConfig\n * in metagame-sdk reads them as bigints directly).\n */\nexport function buildOpusTrovesConfig(cfg: OpusTrovesConfig): string[] {\n return [\n String(cfg.assetAddresses.length),\n ...cfg.assetAddresses,\n cfg.threshold.toString(),\n cfg.valuePerEntry.toString(),\n String(cfg.maxEntries),\n cfg.bannable ? \"1\" : \"0\",\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Merkle config\n// ---------------------------------------------------------------------------\n\nexport interface MerkleConfig {\n /** On-chain tree ID from the merkle-validator's create_tree. */\n treeId: number;\n}\n\n/** Layout: [tree_id]. */\nexport function buildMerkleConfig(cfg: MerkleConfig): string[] {\n return [String(cfg.treeId)];\n}\n\n// ---------------------------------------------------------------------------\n// Tournament participation config\n// ---------------------------------------------------------------------------\n\n/** 0 = participated (any entry counts), 1 = won (placed in top N). */\nexport type TournamentRequirementType = \"participated\" | \"won\";\n\n/**\n * How to combine multiple qualifying tournaments. Matches QualifyingMode\n * in metagame-sdk: 0=AtLeastOne, 1=CumulativePerTournament, 2=All,\n * 3=CumulativePerEntry, 4=AllParticipateAnyWin, 5=AllWithCumulative.\n */\nexport interface TournamentValidatorConfig {\n requirement: TournamentRequirementType;\n /** Tournament IDs whose history qualifies. */\n tournamentIds: string[];\n /** Top N positions that count (only used when requirement = \"won\"). */\n topPositions: number;\n /** Default 0 (= AtLeastOne). */\n qualifyingMode?: number;\n}\n\n/**\n * Layout (from tournament_validator):\n * [qualifier_type, qualifying_mode, top_positions, ...tournament_ids]\n * - qualifier_type: 0 = participated, 1 = won\n * - qualifying_mode: 0–5 enum\n * - top_positions: 0 for \"all positions\" (used with participated)\n */\nexport function buildTournamentValidatorConfig(\n cfg: TournamentValidatorConfig,\n): string[] {\n const qualifierType = cfg.requirement === \"won\" ? \"1\" : \"0\";\n const qualifyingMode = String(cfg.qualifyingMode ?? 0);\n const topPositions =\n cfg.requirement === \"won\" ? String(cfg.topPositions) : \"0\";\n return [qualifierType, qualifyingMode, topPositions, ...cfg.tournamentIds];\n}\n"]}