brawlstars-sdk 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/errors/api-errors.ts","../src/observability/dispatcher.ts","../src/utils/abort.ts","../src/utils/cache-key.ts","../src/utils/headers.ts","../src/utils/hooks.ts","../src/utils/lru-cache.ts","../src/utils/rate-limit.ts","../src/utils/retry.ts","../src/utils/semaphore.ts","../src/utils/sleep.ts","../src/utils/url.ts","../src/internal/http-client.ts","../src/validation/guards.ts","../src/validation/list-response.ts","../src/validation/validators.ts","../src/internal/response-parsers.ts","../src/utils/pagination.ts","../src/utils/options.ts","../src/resources/brawlers-resource.ts","../src/utils/tag.ts","../src/resources/clubs-resource.ts","../src/resources/events-resource.ts","../src/resources/gamemodes-resource.ts","../src/resources/players-resource.ts","../src/resources/rankings-resource.ts","../src/client/brawl-stars-client.ts","../src/client/create-client.ts","../src/observability/prom-client-adapter.ts"],"sourcesContent":["export { BrawlStarsClient } from \"./client/brawl-stars-client.js\";\nexport { createBrawlStarsClient } from \"./client/create-client.js\";\n\nexport {\n ApiError,\n ClientError,\n ValidationError,\n NetworkError,\n RateLimitError,\n ResponseValidationError,\n TimeoutError,\n} from \"./errors/api-errors.js\";\n\nexport type {\n ApiErrorMetadata,\n ApiErrorRequest,\n ResponseValidationMetadata,\n} from \"./errors/api-errors.js\";\n\nexport { createPromClientAdapter } from \"./observability/prom-client-adapter.js\";\nexport { encodeTag } from \"./utils/tag.js\";\nexport type { EncodeTagOptions } from \"./utils/tag.js\";\n\nexport type * from \"./types/index.js\";\n","import type {\n EndpointName,\n HttpMethod,\n RequestCacheOptions,\n RetryOptions,\n ValidationMode,\n} from \"../types/client.js\";\n\n/**\n * Request metadata attached to errors.\n */\nexport interface ApiErrorRequest {\n method: HttpMethod;\n url: string;\n options?: {\n timeoutMs?: number | undefined;\n retries?: number | Partial<RetryOptions> | undefined;\n cache?: boolean | RequestCacheOptions | undefined;\n validation?: ValidationMode | undefined;\n headers?: Readonly<Record<string, string>> | undefined;\n } | undefined;\n}\n\n/**\n * Structured metadata attached to all API errors.\n */\nexport interface ApiErrorMetadata {\n endpoint: EndpointName;\n method: HttpMethod;\n request?: ApiErrorRequest | undefined;\n statusCode?: number | undefined;\n headers?: Readonly<Record<string, string>> | undefined;\n body?: unknown;\n responseBody?: unknown;\n received?: unknown;\n retryAfter?: number | null | undefined;\n retryAfterMs?: number | undefined;\n requestId?: string | undefined;\n cause?: unknown;\n}\n\n/**\n * Metadata for strict response validation failures.\n */\nexport interface ResponseValidationMetadata extends ApiErrorMetadata {\n expectedSchema: string;\n actualPayload: unknown;\n}\n\n/**\n * Base error for all request failures.\n */\nexport class ApiError extends Error {\n public readonly endpoint: EndpointName;\n public readonly method: HttpMethod;\n public readonly request?: ApiErrorRequest | undefined;\n public readonly statusCode?: number | undefined;\n public readonly headers: Readonly<Record<string, string>>;\n public readonly body?: unknown;\n public readonly responseBody?: unknown;\n public readonly retryAfter: number | null;\n public readonly retryAfterMs?: number | undefined;\n public readonly requestId?: string | undefined;\n\n public constructor(message: string, metadata: ApiErrorMetadata) {\n super(message, metadata.cause ? { cause: metadata.cause } : undefined);\n\n this.name = \"ApiError\";\n this.endpoint = metadata.endpoint;\n this.method = metadata.method;\n this.request = metadata.request;\n this.statusCode = metadata.statusCode;\n this.headers = metadata.headers ?? {};\n this.body = metadata.body ?? metadata.responseBody ?? metadata.received;\n this.responseBody = this.body;\n this.retryAfter =\n metadata.retryAfter\n ?? (metadata.retryAfterMs !== undefined ? Math.max(0, Math.ceil(metadata.retryAfterMs / 1000)) : null);\n this.retryAfterMs =\n metadata.retryAfterMs\n ?? (this.retryAfter !== null ? this.retryAfter * 1000 : undefined);\n this.requestId = metadata.requestId;\n }\n}\n\n/**\n * Error raised for 4xx responses produced by the API.\n */\nexport class ClientError extends ApiError {\n public constructor(message: string, metadata: ApiErrorMetadata) {\n super(message, metadata);\n this.name = \"ClientError\";\n }\n}\n\n/**\n * Error raised when the API returns a throttling response.\n */\nexport class RateLimitError extends ApiError {\n public constructor(message: string, metadata: ApiErrorMetadata) {\n super(message, metadata);\n this.name = \"RateLimitError\";\n }\n}\n\n/**\n * Error raised when a request exceeds the configured timeout.\n */\nexport class TimeoutError extends ApiError {\n public constructor(message: string, metadata: ApiErrorMetadata) {\n super(message, metadata);\n this.name = \"TimeoutError\";\n }\n}\n\n/**\n * Error raised when network transport fails.\n */\nexport class NetworkError extends ApiError {\n public constructor(message: string, metadata: ApiErrorMetadata) {\n super(message, metadata);\n this.name = \"NetworkError\";\n }\n}\n\n/**\n * Error raised when runtime response validation fails.\n */\nexport class ValidationError extends ApiError {\n public constructor(message: string, metadata: ApiErrorMetadata) {\n super(message, metadata);\n this.name = \"ValidationError\";\n }\n}\n\n/**\n * Error raised when strict response schema validation fails.\n */\nexport class ResponseValidationError extends ValidationError {\n public readonly expectedSchema: string;\n public readonly actualPayload: unknown;\n\n public constructor(message: string, metadata: ResponseValidationMetadata) {\n super(message, metadata);\n this.name = \"ResponseValidationError\";\n this.expectedSchema = metadata.expectedSchema;\n this.actualPayload = metadata.actualPayload;\n }\n}\n","import type {\n MetricsAdapter,\n ObservabilityListeners,\n RequestEndEvent,\n RequestErrorEvent,\n RequestStartEvent,\n} from \"../types/observability.js\";\n\ninterface NormalizedListeners {\n requestStart: ReadonlyArray<(event: RequestStartEvent) => void | Promise<void>>;\n requestEnd: ReadonlyArray<(event: RequestEndEvent) => void | Promise<void>>;\n requestError: ReadonlyArray<(event: RequestErrorEvent) => void | Promise<void>>;\n}\n\nfunction toArray<T>(\n value: T | ReadonlyArray<T> | undefined,\n): ReadonlyArray<T> {\n if (value === undefined) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value as ReadonlyArray<T>;\n }\n\n return [value as T];\n}\n\n/**\n * Event dispatcher used by the HTTP core.\n */\nexport class ObservabilityDispatcher {\n private readonly listeners: NormalizedListeners;\n private readonly metrics: ReadonlyArray<MetricsAdapter>;\n\n public constructor(\n listeners: ObservabilityListeners | undefined,\n metrics: MetricsAdapter | ReadonlyArray<MetricsAdapter> | undefined,\n ) {\n this.listeners = {\n requestStart: toArray(listeners?.requestStart),\n requestEnd: toArray(listeners?.requestEnd),\n requestError: toArray(listeners?.requestError),\n };\n this.metrics = toArray(metrics);\n }\n\n /**\n * Emit a request-start event.\n */\n public async emitRequestStart(event: RequestStartEvent): Promise<void> {\n for (const listener of this.listeners.requestStart) {\n await listener(event);\n }\n\n for (const adapter of this.metrics) {\n adapter.onRequestStart?.(event);\n }\n }\n\n /**\n * Emit a request-end event.\n */\n public async emitRequestEnd(event: RequestEndEvent): Promise<void> {\n for (const listener of this.listeners.requestEnd) {\n await listener(event);\n }\n\n for (const adapter of this.metrics) {\n adapter.onRequestEnd?.(event);\n }\n }\n\n /**\n * Emit a request-error event.\n */\n public async emitRequestError(event: RequestErrorEvent): Promise<void> {\n for (const listener of this.listeners.requestError) {\n await listener(event);\n }\n\n for (const adapter of this.metrics) {\n adapter.onRequestError?.(event);\n }\n }\n}\n","/**\n * Build a request signal from timeout and optional external signal.\n */\nexport function createRequestSignal(\n timeoutMs: number,\n externalSignal?: AbortSignal,\n): {\n signal: AbortSignal;\n cleanup: () => void;\n timedOut: () => boolean;\n} {\n const controller = new AbortController();\n let timeoutId: NodeJS.Timeout | undefined;\n let didTimeout = false;\n\n const onExternalAbort = () => {\n controller.abort(externalSignal?.reason);\n };\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n controller.abort(externalSignal.reason);\n } else {\n externalSignal.addEventListener(\"abort\", onExternalAbort, { once: true });\n }\n }\n\n if (timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeout = true;\n controller.abort(new Error(\"Request timed out\"));\n }, timeoutMs);\n }\n\n return {\n signal: controller.signal,\n cleanup: () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n externalSignal?.removeEventListener(\"abort\", onExternalAbort);\n },\n timedOut: () => didTimeout,\n };\n}\n","import type { HttpMethod } from \"../types/client.js\";\n\n/**\n * Minimal request shape used by cache-key generation.\n */\nexport interface RequestLike {\n method: HttpMethod | string;\n url: string;\n headers?: Headers | HeadersInit | undefined;\n body?: unknown;\n}\n\n/**\n * Default request headers included in cache-key generation.\n * Volatile headers (authorization, date, request-id, tracing) are excluded by default.\n */\nexport const DEFAULT_CACHE_HEADER_WHITELIST: ReadonlyArray<string> = [\"accept-language\"];\n\nfunction normalizeHeaderName(name: string): string {\n return name.toLowerCase().trim();\n}\n\nfunction serializeBodyValue(value: unknown, seen: Set<unknown>): string {\n if (value === null) {\n return \"null\";\n }\n\n const valueType = typeof value;\n if (valueType === \"string\") {\n return JSON.stringify(value);\n }\n if (valueType === \"number\" || valueType === \"boolean\") {\n return String(value);\n }\n if (valueType === \"undefined\") {\n return \"undefined\";\n }\n if (valueType === \"bigint\") {\n return `${String(value)}n`;\n }\n if (value instanceof Date) {\n return `date:${value.toISOString()}`;\n }\n if (value instanceof URLSearchParams) {\n const sorted = [...value.entries()]\n .sort(([leftKey, leftValue], [rightKey, rightValue]) => {\n if (leftKey === rightKey) {\n return leftValue.localeCompare(rightValue);\n }\n\n return leftKey.localeCompare(rightKey);\n })\n .map(([key, entryValue]) => `${encodeURIComponent(key)}=${encodeURIComponent(entryValue)}`)\n .join(\"&\");\n return `params:${sorted}`;\n }\n if (value instanceof ArrayBuffer) {\n return `buffer:${Array.from(new Uint8Array(value)).join(\".\")}`;\n }\n if (ArrayBuffer.isView(value)) {\n const view = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n return `view:${Array.from(view).join(\".\")}`;\n }\n\n if (Array.isArray(value)) {\n if (seen.has(value)) {\n return \"[circular]\";\n }\n seen.add(value);\n const serialized = `[${value.map((entry) => serializeBodyValue(entry, seen)).join(\",\")}]`;\n seen.delete(value);\n return serialized;\n }\n\n if (typeof value === \"object\") {\n if (seen.has(value)) {\n return \"{circular}\";\n }\n seen.add(value);\n const record = value as Record<string, unknown>;\n const serialized = `{${Object.keys(record)\n .sort((left, right) => left.localeCompare(right))\n .map((key) => `${JSON.stringify(key)}:${serializeBodyValue(record[key], seen)}`)\n .join(\",\")}}`;\n seen.delete(value);\n return serialized;\n }\n\n return JSON.stringify(String(value));\n}\n\nfunction hashString(input: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n hash ^= input.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\n/**\n * Build a deterministic cache key from request method, URL and whitelisted headers.\n */\nexport function createCacheKey(\n request: RequestLike,\n whitelistHeaders: ReadonlyArray<string> = DEFAULT_CACHE_HEADER_WHITELIST,\n): string {\n const url = new URL(request.url);\n const method = String(request.method).toUpperCase();\n const query = [...url.searchParams.entries()]\n .sort(([leftKey, leftValue], [rightKey, rightValue]) => {\n if (leftKey === rightKey) {\n return leftValue.localeCompare(rightValue);\n }\n\n return leftKey.localeCompare(rightKey);\n })\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join(\"&\");\n\n const allowed = new Set(whitelistHeaders.map((header) => normalizeHeaderName(header)));\n const requestHeaders = new Headers(request.headers ?? {});\n const relevantHeaders = [...requestHeaders.entries()]\n .filter(([name]) => allowed.has(normalizeHeaderName(name)))\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([name, value]) => `${normalizeHeaderName(name)}:${value}`)\n .join(\"|\");\n\n const serializedBody =\n request.body === undefined ? \"\" : serializeBodyValue(request.body, new Set<unknown>());\n const bodyHash = hashString(serializedBody);\n\n return `${method}|${url.pathname}|${query}|${bodyHash}|${relevantHeaders}`;\n}\n","/**\n * Merge default headers with request-level overrides.\n */\nexport function mergeHeaders(defaultHeaders: HeadersInit, override?: HeadersInit): Headers {\n const headers = new Headers(defaultHeaders);\n\n if (!override) {\n return headers;\n }\n\n const overrideHeaders = new Headers(override);\n overrideHeaders.forEach((value, key) => {\n headers.set(key, value);\n });\n\n return headers;\n}\n\n/**\n * Convert headers to a plain object while redacting authorization secrets.\n */\nexport function toSafeHeaderObject(headers: Headers): Record<string, string> {\n const entries: Record<string, string> = {};\n\n headers.forEach((value, key) => {\n const normalizedKey = key.toLowerCase();\n if (normalizedKey === \"authorization\") {\n entries[key] = \"[REDACTED]\";\n return;\n }\n\n entries[key] = value;\n });\n\n return entries;\n}\n","import type {\n AfterResponseContext,\n BeforeRequestContext,\n ClientHooks,\n ErrorContext,\n RateLimitContext,\n HookFn,\n} from \"../types/client.js\";\n\n/**\n * Normalized hooks shape for internal iteration.\n */\nexport interface NormalizedHooks {\n beforeRequest: ReadonlyArray<HookFn<BeforeRequestContext>>;\n afterResponse: ReadonlyArray<HookFn<AfterResponseContext>>;\n onError: ReadonlyArray<HookFn<ErrorContext>>;\n onRateLimit: ReadonlyArray<HookFn<RateLimitContext>>;\n}\n\nfunction asArray<TContext>(\n hook: HookFn<TContext> | ReadonlyArray<HookFn<TContext>> | undefined,\n): ReadonlyArray<HookFn<TContext>> {\n if (hook === undefined) {\n return [];\n }\n\n if (Array.isArray(hook)) {\n return hook as ReadonlyArray<HookFn<TContext>>;\n }\n\n return [hook as HookFn<TContext>];\n}\n\n/**\n * Convert optional hooks object into normalized arrays.\n */\nexport function normalizeHooks(hooks?: ClientHooks): NormalizedHooks {\n return {\n beforeRequest: asArray(hooks?.beforeRequest),\n afterResponse: asArray(hooks?.afterResponse),\n onError: asArray(hooks?.onError),\n onRateLimit: asArray(hooks?.onRateLimit),\n };\n}\n\n/**\n * Merge global and request-level hooks while preserving execution order.\n */\nexport function mergeHooks(globalHooks: NormalizedHooks, requestHooks?: ClientHooks): NormalizedHooks {\n const localHooks = normalizeHooks(requestHooks);\n\n return {\n beforeRequest: [...globalHooks.beforeRequest, ...localHooks.beforeRequest],\n afterResponse: [...globalHooks.afterResponse, ...localHooks.afterResponse],\n onError: [...globalHooks.onError, ...localHooks.onError],\n onRateLimit: [...globalHooks.onRateLimit, ...localHooks.onRateLimit],\n };\n}\n","interface CacheEntry<TValue> {\n value: TValue;\n expiresAt: number;\n}\n\n/**\n * Small LRU cache with per-entry TTL.\n */\nexport class LruTtlCache<TKey, TValue> {\n private readonly entries = new Map<TKey, CacheEntry<TValue>>();\n\n public constructor(private readonly maxSize: number) {\n if (!Number.isInteger(maxSize) || maxSize <= 0) {\n throw new Error(\"Cache maxSize must be a positive integer.\");\n }\n }\n\n /**\n * Read an entry and refresh LRU order.\n */\n public get(key: TKey, nowMs: number = Date.now()): TValue | undefined {\n const entry = this.entries.get(key);\n if (!entry) {\n return undefined;\n }\n\n if (entry.expiresAt <= nowMs) {\n this.entries.delete(key);\n return undefined;\n }\n\n this.entries.delete(key);\n this.entries.set(key, entry);\n\n return entry.value;\n }\n\n /**\n * Store an entry with a dedicated TTL.\n */\n public set(key: TKey, value: TValue, ttlMs: number, nowMs: number = Date.now()): void {\n if (ttlMs <= 0) {\n return;\n }\n\n if (this.entries.has(key)) {\n this.entries.delete(key);\n }\n\n this.entries.set(key, {\n value,\n expiresAt: nowMs + ttlMs,\n });\n\n this.evictOverflow();\n }\n\n /**\n * Delete a single cache entry.\n */\n public delete(key: TKey): boolean {\n return this.entries.delete(key);\n }\n\n /**\n * Delete entries that match a predicate.\n */\n public deleteWhere(predicate: (key: TKey, value: TValue) => boolean): number {\n let removed = 0;\n\n for (const [key, entry] of this.entries.entries()) {\n if (predicate(key, entry.value)) {\n this.entries.delete(key);\n removed += 1;\n }\n }\n\n return removed;\n }\n\n /**\n * Current cache size.\n */\n public size(): number {\n return this.entries.size;\n }\n\n /**\n * Clear all cached entries.\n */\n public clear(): void {\n this.entries.clear();\n }\n\n private evictOverflow(): void {\n while (this.entries.size > this.maxSize) {\n const iteratorResult = this.entries.keys().next();\n if (iteratorResult.done) {\n break;\n }\n\n this.entries.delete(iteratorResult.value);\n }\n }\n}\n","/**\n * Scope of a rate-limit signal.\n */\nexport type RateLimitScope = \"global\" | \"route\";\n\nconst RETRY_AFTER_HEADERS = [\"retry-after\"];\nconst RESET_AFTER_HEADERS = [\n \"x-ratelimit-reset-after\",\n \"x-rate-limit-reset-after\",\n \"ratelimit-reset-after\",\n];\nconst RESET_HEADERS = [\n \"x-ratelimit-reset\",\n \"x-rate-limit-reset\",\n \"ratelimit-reset\",\n];\nconst REMAINING_HEADERS = [\n \"x-ratelimit-remaining\",\n \"x-rate-limit-remaining\",\n \"ratelimit-remaining\",\n];\nconst SCOPE_HEADERS = [\n \"x-ratelimit-scope\",\n \"x-rate-limit-scope\",\n \"ratelimit-scope\",\n];\n\nfunction normalizeHeaderName(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]/gu, \"\");\n}\n\nfunction getHeaderValue(headers: Headers, candidates: ReadonlyArray<string>): string | null {\n for (const candidate of candidates) {\n const value = headers.get(candidate);\n if (value !== null) {\n return value;\n }\n }\n\n const candidateNames = new Set(candidates.map((candidate) => normalizeHeaderName(candidate)));\n for (const [name, value] of headers.entries()) {\n if (candidateNames.has(normalizeHeaderName(name))) {\n return value;\n }\n }\n\n return null;\n}\n\n/**\n * Parse `Retry-After` into seconds, supporting numeric and HTTP-date formats.\n */\nexport function parseRetryAfterSeconds(\n retryAfterHeader: string | null | undefined,\n nowMs: number = Date.now(),\n): number | null {\n if (!retryAfterHeader) {\n return null;\n }\n\n const normalized = retryAfterHeader.trim();\n if (normalized.length === 0) {\n return null;\n }\n\n const numericSeconds = Number(normalized);\n if (Number.isFinite(numericSeconds)) {\n return Math.max(0, Math.ceil(numericSeconds));\n }\n\n const dateValue = Date.parse(normalized);\n if (Number.isNaN(dateValue)) {\n return null;\n }\n\n return Math.max(0, Math.ceil((dateValue - nowMs) / 1000));\n}\n\n/**\n * Parse a `Retry-After` header value to milliseconds.\n */\nexport function parseRetryAfterMs(\n retryAfterHeader: string | null | undefined,\n nowMs: number = Date.now(),\n): number | undefined {\n const retryAfterSeconds = parseRetryAfterSeconds(retryAfterHeader, nowMs);\n if (retryAfterSeconds === null) {\n return undefined;\n }\n\n return retryAfterSeconds * 1000;\n}\n\n/**\n * Parse reset-header variants into delay in milliseconds.\n */\nexport function parseRateLimitResetMs(\n resetHeader: string | null | undefined,\n nowMs: number = Date.now(),\n): number | undefined {\n if (!resetHeader) {\n return undefined;\n }\n\n const numeric = Number(resetHeader.trim());\n if (!Number.isFinite(numeric)) {\n return undefined;\n }\n\n if (numeric > 1_000_000_000_000) {\n return Math.max(0, Math.round(numeric - nowMs));\n }\n\n if (numeric > 1_000_000_000) {\n return Math.max(0, Math.round((numeric * 1000) - nowMs));\n }\n\n return Math.max(0, Math.round(numeric * 1000));\n}\n\n/**\n * Compute best-effort throttling delay from known rate-limit headers.\n */\nexport function parseRateLimitDelayMs(\n headers: Headers,\n nowMs: number = Date.now(),\n): number | undefined {\n const retryAfterMs = parseRetryAfterMs(getHeaderValue(headers, RETRY_AFTER_HEADERS), nowMs);\n const resetAfterMs = parseRateLimitResetMs(getHeaderValue(headers, RESET_AFTER_HEADERS), nowMs);\n const resetMs = parseRateLimitResetMs(getHeaderValue(headers, RESET_HEADERS), nowMs);\n\n const values = [retryAfterMs, resetAfterMs, resetMs].filter(\n (value): value is number => value !== undefined,\n );\n\n if (values.length === 0) {\n return undefined;\n }\n\n return Math.max(...values);\n}\n\n/**\n * Extract `Retry-After` in seconds from response headers.\n */\nexport function extractRetryAfterSeconds(\n headers: Headers,\n nowMs: number = Date.now(),\n): number | null {\n return parseRetryAfterSeconds(getHeaderValue(headers, RETRY_AFTER_HEADERS), nowMs);\n}\n\n/**\n * Detect whether rate-limit budget has been exhausted for the current window.\n */\nexport function isRateLimitExhausted(headers: Headers): boolean {\n const remaining = getHeaderValue(headers, REMAINING_HEADERS);\n if (remaining === null) {\n return false;\n }\n\n const numeric = Number(remaining);\n if (!Number.isFinite(numeric)) {\n return false;\n }\n\n return numeric <= 0;\n}\n\n/**\n * Parse server-specific scope hints for rate-limits.\n */\nexport function parseRateLimitScope(headers: Headers): RateLimitScope {\n const scope = getHeaderValue(headers, SCOPE_HEADERS)?.toLowerCase() ?? \"\";\n if (scope.includes(\"global\")) {\n return \"global\";\n }\n\n return \"route\";\n}\n","import type { RetryOptions } from \"../types/client.js\";\n\n/**\n * Default retry configuration tuned for read-only API calls.\n */\nexport const DEFAULT_RETRY_OPTIONS: RetryOptions = {\n maxAttempts: 4,\n baseDelayMs: 100,\n maxDelayMs: 10_000,\n backoffFactor: 2,\n jitter: \"full\",\n retryableStatusCodes: [429, 500, 502, 503, 504],\n};\n\n/**\n * Merge retry options with defaults.\n */\nexport function resolveRetryOptions(input?: number | Partial<RetryOptions>): RetryOptions {\n if (typeof input === \"number\") {\n return {\n ...DEFAULT_RETRY_OPTIONS,\n maxAttempts: Math.max(1, Math.floor(input)),\n };\n }\n\n if (!input) {\n return DEFAULT_RETRY_OPTIONS;\n }\n\n return {\n maxAttempts: Math.max(1, Math.floor(input.maxAttempts ?? DEFAULT_RETRY_OPTIONS.maxAttempts)),\n baseDelayMs: Math.max(0, Math.floor(input.baseDelayMs ?? DEFAULT_RETRY_OPTIONS.baseDelayMs)),\n maxDelayMs: Math.max(0, Math.floor(input.maxDelayMs ?? DEFAULT_RETRY_OPTIONS.maxDelayMs)),\n backoffFactor: Math.max(1, input.backoffFactor ?? DEFAULT_RETRY_OPTIONS.backoffFactor),\n jitter: input.jitter ?? DEFAULT_RETRY_OPTIONS.jitter,\n retryableStatusCodes:\n input.retryableStatusCodes ?? DEFAULT_RETRY_OPTIONS.retryableStatusCodes,\n };\n}\n\n/**\n * Determine whether status code is retryable.\n */\nexport function isRetryableStatus(statusCode: number, options: RetryOptions): boolean {\n return options.retryableStatusCodes.includes(statusCode);\n}\n\n/**\n * Compute exponential backoff delay with optional full jitter.\n */\nexport function computeRetryDelayMs(\n retryNumber: number,\n options: RetryOptions,\n randomValue: number,\n minimumDelayMs?: number,\n): number {\n const exponent = Math.max(0, retryNumber - 1);\n const cappedDelay = Math.min(\n options.baseDelayMs * options.backoffFactor ** exponent,\n options.maxDelayMs,\n );\n\n const boundedRandom = Math.min(1, Math.max(0, randomValue));\n const delay =\n options.jitter === \"full\"\n ? Math.round(boundedRandom * cappedDelay)\n : Math.round(cappedDelay);\n\n if (minimumDelayMs === undefined) {\n return delay;\n }\n\n return Math.max(delay, minimumDelayMs);\n}\n","/**\n * Lightweight FIFO semaphore used to cap in-flight requests.\n */\nexport class Semaphore {\n private readonly queue: Array<() => void> = [];\n private inUse = 0;\n\n public constructor(private readonly capacity: number) {\n if (!Number.isInteger(capacity) || capacity <= 0) {\n throw new Error(\"Semaphore capacity must be a positive integer.\");\n }\n }\n\n /**\n * Acquire one slot and return a release function.\n */\n public async acquire(): Promise<() => void> {\n if (this.inUse < this.capacity) {\n this.inUse += 1;\n return () => {\n this.release();\n };\n }\n\n await new Promise<void>((resolve) => {\n this.queue.push(resolve);\n });\n\n this.inUse += 1;\n\n return () => {\n this.release();\n };\n }\n\n private release(): void {\n this.inUse = Math.max(0, this.inUse - 1);\n\n const next = this.queue.shift();\n if (next) {\n next();\n }\n }\n}\n","/**\n * Resolve after the provided delay.\n */\nexport function sleep(delayMs: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, delayMs);\n });\n}\n","/**\n * Build request URL using base URL, path and optional query params.\n */\nexport function buildUrl(\n baseUrl: string,\n apiPath: string,\n query?: Readonly<Record<string, string | number | boolean | undefined>>,\n): string {\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const path = apiPath.startsWith(\"/\") ? apiPath : `/${apiPath}`;\n const url = new URL(`${base}${path}`);\n\n if (!query) {\n return url.toString();\n }\n\n const queryEntries = Object.entries(query)\n .filter((entry): entry is [string, string | number | boolean] => entry[1] !== undefined)\n .sort(([left], [right]) => left.localeCompare(right));\n\n for (const [key, value] of queryEntries) {\n if (value === undefined) {\n continue;\n }\n\n url.searchParams.set(key, String(value));\n }\n\n return url.toString();\n}\n","import {\n ApiError,\n ClientError,\n NetworkError,\n RateLimitError,\n ResponseValidationError,\n TimeoutError,\n} from \"../errors/api-errors.js\";\nimport { ObservabilityDispatcher } from \"../observability/dispatcher.js\";\nimport type { EndpointParser } from \"./response-parsers.js\";\nimport type {\n BrawlStarsClientOptions,\n CacheOptions,\n ClientLogger,\n EndpointName,\n HttpMethod,\n RequestCacheOptions,\n RequestOptions,\n RetryOptions,\n ValidationMode,\n} from \"../types/client.js\";\nimport { createRequestSignal } from \"../utils/abort.js\";\nimport {\n createCacheKey,\n DEFAULT_CACHE_HEADER_WHITELIST,\n} from \"../utils/cache-key.js\";\nimport { mergeHeaders, toSafeHeaderObject } from \"../utils/headers.js\";\nimport { mergeHooks, normalizeHooks, type NormalizedHooks } from \"../utils/hooks.js\";\nimport { LruTtlCache } from \"../utils/lru-cache.js\";\nimport {\n extractRetryAfterSeconds,\n isRateLimitExhausted,\n parseRateLimitDelayMs,\n parseRateLimitScope,\n} from \"../utils/rate-limit.js\";\nimport { computeRetryDelayMs, isRetryableStatus, resolveRetryOptions } from \"../utils/retry.js\";\nimport { Semaphore } from \"../utils/semaphore.js\";\nimport { sleep } from \"../utils/sleep.js\";\nimport { buildUrl } from \"../utils/url.js\";\n\ninterface ResolvedCacheSettings {\n enabled: boolean;\n maxSize: number;\n ttlMs: number;\n endpointTtlMs: Partial<Record<EndpointName, number>>;\n}\n\ninterface InternalRequestConfig<TResponse> {\n endpoint: EndpointName;\n method: HttpMethod;\n path: string;\n query?: Readonly<Record<string, string | number | boolean | undefined>> | undefined;\n options?: RequestOptions | undefined;\n parser: EndpointParser<TResponse>;\n}\n\ninterface ResolvedCachePolicy {\n enabled: boolean;\n ttlMs: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 12_000;\nconst DEFAULT_CONCURRENCY_LIMIT = 8;\n\n/**\n * Internal HTTP layer used by all endpoint resources.\n */\nexport class HttpClient {\n private readonly fetchFn: typeof fetch;\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly retryOptions: RetryOptions;\n private readonly validationMode: ValidationMode;\n private readonly logger: ClientLogger;\n private readonly defaultHeaders: Headers;\n private readonly hooks: NormalizedHooks;\n private readonly observability: ObservabilityDispatcher;\n private readonly cacheSettings: ResolvedCacheSettings;\n private readonly cacheKeyHeaders: ReadonlyArray<string>;\n private readonly cache: LruTtlCache<string, unknown> | null;\n private readonly semaphore: Semaphore;\n\n private globalRateLimitUntilMs = 0;\n private readonly routeRateLimitUntilMs = new Map<string, number>();\n private readonly endpointCacheIndex = new Map<EndpointName, Set<string>>();\n private requestCounter = 0;\n\n public constructor(options: BrawlStarsClientOptions) {\n const token = options.token.trim();\n if (!token) {\n throw new Error(\"BrawlStarsClient requires a non-empty token.\");\n }\n\n this.fetchFn = options.fetch ?? globalThis.fetch;\n if (!this.fetchFn) {\n throw new Error(\"No fetch implementation available. Provide options.fetch.\");\n }\n\n this.baseUrl = (options.baseUrl ?? \"https://api.brawlstars.com/v1\").replace(/\\/+$/u, \"\");\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.retryOptions = resolveRetryOptions(options.retries);\n this.validationMode = this.resolveValidationMode(options.validation, options.validateResponses);\n this.logger = options.logger ?? console;\n this.defaultHeaders = new Headers({\n Authorization: `Bearer ${token}`,\n Accept: \"application/json\",\n });\n this.hooks = normalizeHooks(options.hooks);\n this.observability = new ObservabilityDispatcher(\n options.observability?.listeners,\n options.observability?.metrics,\n );\n\n this.cacheSettings = this.resolveCacheSettings(options.cache);\n this.cacheKeyHeaders = options.cacheKeyHeaders ?? DEFAULT_CACHE_HEADER_WHITELIST;\n this.cache = this.cacheSettings.enabled\n ? new LruTtlCache<string, unknown>(this.cacheSettings.maxSize)\n : null;\n\n const concurrency = options.concurrencyLimit ?? DEFAULT_CONCURRENCY_LIMIT;\n this.semaphore = new Semaphore(concurrency);\n }\n\n /**\n * Execute a typed request against the API.\n */\n public async request<TResponse>(config: InternalRequestConfig<TResponse>): Promise<TResponse> {\n return this.executeRequest(config);\n }\n\n /**\n * Clear all in-memory cached responses.\n */\n public clearCache(): void {\n this.cache?.clear();\n this.endpointCacheIndex.clear();\n }\n\n /**\n * Invalidate cached responses for a given endpoint, or all endpoints when omitted.\n */\n public invalidateCache(endpoint?: EndpointName): number {\n if (!this.cache) {\n return 0;\n }\n\n if (!endpoint) {\n const sizeBefore = this.cache.size();\n this.cache.clear();\n this.endpointCacheIndex.clear();\n return sizeBefore;\n }\n\n const keys = this.endpointCacheIndex.get(endpoint);\n if (!keys) {\n return 0;\n }\n\n let removed = 0;\n for (const key of keys) {\n if (this.cache.delete(key)) {\n removed += 1;\n }\n }\n this.endpointCacheIndex.delete(endpoint);\n return removed;\n }\n\n private async executeRequest<TResponse>(\n config: InternalRequestConfig<TResponse>,\n ): Promise<TResponse> {\n const retryOptions = resolveRetryOptions(config.options?.retries ?? this.retryOptions);\n const timeoutMs = config.options?.timeoutMs ?? this.timeoutMs;\n const validationMode = this.resolveValidationMode(\n config.options?.validation,\n config.options?.validateResponse,\n this.validationMode,\n );\n const hooks = mergeHooks(this.hooks, config.options?.hooks);\n\n const url = buildUrl(this.baseUrl, config.path, config.query);\n const headers = mergeHeaders(this.defaultHeaders, config.options?.headers);\n const safeRequestHeaders = toSafeHeaderObject(headers);\n const requestMetadata = this.createRequestMetadata(config.method, url, config.options, safeRequestHeaders);\n\n const requestId = this.createRequestId();\n const routeKey = config.endpoint;\n const cachePolicy = this.resolveCachePolicy(config.endpoint, config.options?.cache);\n const cacheKey = createCacheKey({\n method: config.method,\n url,\n headers,\n }, this.cacheKeyHeaders);\n const canUseCache = cachePolicy.enabled && this.cache && this.isCacheableMethod(config.method);\n\n if (canUseCache) {\n const cached = this.cache.get(cacheKey);\n if (cached !== undefined) {\n return cached as TResponse;\n }\n }\n\n for (let attempt = 1; attempt <= retryOptions.maxAttempts; attempt += 1) {\n await this.waitForRateLimitWindow(routeKey);\n const release = await this.semaphore.acquire();\n\n const startedAt = Date.now();\n const { signal, cleanup, timedOut } = createRequestSignal(timeoutMs, config.options?.signal);\n let emittedAttemptError = false;\n\n try {\n await this.observability.emitRequestStart({\n requestId,\n endpoint: config.endpoint,\n method: config.method,\n url,\n attempt,\n });\n\n for (const hook of hooks.beforeRequest) {\n await hook({\n endpoint: config.endpoint,\n method: config.method,\n url,\n attempt,\n requestId,\n headers: safeRequestHeaders,\n });\n }\n\n const response = await this.fetchFn(url, {\n method: config.method,\n headers,\n signal,\n });\n\n const durationMs = Date.now() - startedAt;\n const safeResponseHeaders = toSafeHeaderObject(response.headers);\n\n await this.observability.emitRequestEnd({\n requestId,\n endpoint: config.endpoint,\n method: config.method,\n url,\n attempt,\n statusCode: response.status,\n durationMs,\n });\n\n for (const hook of hooks.afterResponse) {\n await hook({\n endpoint: config.endpoint,\n method: config.method,\n url,\n attempt,\n requestId,\n durationMs,\n statusCode: response.status,\n headers: safeResponseHeaders,\n });\n }\n\n this.updateRateLimitState(response.headers, response.status, routeKey);\n\n if (response.ok) {\n const payload = await this.parseResponseBody(response);\n\n const shouldValidate = validationMode === \"strict\" || validationMode === \"warn\";\n let parsed: TResponse;\n try {\n parsed = config.parser(payload, shouldValidate);\n } catch (error) {\n if (validationMode === \"off\") {\n parsed = payload as TResponse;\n } else if (validationMode === \"warn\") {\n this.logger.warn(\n `[brawlstars-client] response validation warning (${config.endpoint}): ${(error as Error).message}`,\n );\n parsed = payload as TResponse;\n } else {\n throw new ResponseValidationError(\"Response schema validation failed.\", {\n endpoint: config.endpoint,\n method: config.method,\n statusCode: response.status,\n headers: safeResponseHeaders,\n request: requestMetadata,\n expectedSchema: config.endpoint,\n actualPayload: payload,\n received: payload,\n requestId,\n cause: error,\n });\n }\n }\n\n if (canUseCache) {\n this.cache.set(cacheKey, parsed, cachePolicy.ttlMs);\n this.trackEndpointCacheKey(config.endpoint, cacheKey);\n }\n\n cleanup();\n return parsed;\n }\n\n const errorBody = await this.parseResponseBody(response);\n const retryAfter = extractRetryAfterSeconds(response.headers);\n const requestHeaderId = response.headers.get(\"x-request-id\") ?? undefined;\n const canRetry =\n attempt < retryOptions.maxAttempts && isRetryableStatus(response.status, retryOptions);\n\n const error = this.createApiError(\n config.endpoint,\n config.method,\n url,\n config.options,\n safeRequestHeaders,\n response.status,\n safeResponseHeaders,\n errorBody,\n retryAfter,\n requestHeaderId,\n );\n\n if (response.status === 429) {\n for (const hook of hooks.onRateLimit) {\n await hook({\n endpoint: config.endpoint,\n method: config.method,\n url,\n attempt,\n requestId,\n statusCode: response.status,\n retryAfter,\n headers: safeResponseHeaders,\n });\n }\n }\n\n await this.emitError(hooks, {\n endpoint: config.endpoint,\n method: config.method,\n url,\n attempt,\n requestId,\n durationMs,\n willRetry: canRetry,\n error,\n });\n emittedAttemptError = true;\n\n cleanup();\n\n if (!canRetry) {\n throw error;\n }\n\n const rateLimitDelayMs = parseRateLimitDelayMs(response.headers);\n const retryDelayMs = computeRetryDelayMs(\n attempt,\n retryOptions,\n Math.random(),\n rateLimitDelayMs,\n );\n\n if (retryDelayMs > 0) {\n await sleep(retryDelayMs);\n }\n\n continue;\n } catch (error) {\n cleanup();\n\n if (error instanceof ApiError) {\n if (!emittedAttemptError) {\n await this.emitError(hooks, {\n endpoint: config.endpoint,\n method: config.method,\n url,\n attempt,\n requestId,\n durationMs: Date.now() - startedAt,\n willRetry: false,\n error,\n });\n }\n\n throw error;\n }\n\n const durationMs = Date.now() - startedAt;\n const wasExternallyAborted = Boolean(config.options?.signal?.aborted) && !timedOut();\n const canRetry = attempt < retryOptions.maxAttempts && !wasExternallyAborted;\n\n const networkError = timedOut()\n ? new TimeoutError(\"Request timed out.\", {\n endpoint: config.endpoint,\n method: config.method,\n request: requestMetadata,\n headers: {},\n retryAfter: null,\n requestId,\n cause: error,\n })\n : new NetworkError(\n wasExternallyAborted ? \"Request was aborted by caller.\" : \"Network request failed.\",\n {\n endpoint: config.endpoint,\n method: config.method,\n request: requestMetadata,\n headers: {},\n retryAfter: null,\n requestId,\n cause: error,\n },\n );\n\n await this.emitError(hooks, {\n endpoint: config.endpoint,\n method: config.method,\n url,\n attempt,\n requestId,\n durationMs,\n willRetry: canRetry,\n error: networkError,\n });\n\n if (!canRetry) {\n throw networkError;\n }\n\n const retryDelayMs = computeRetryDelayMs(attempt, retryOptions, Math.random());\n if (retryDelayMs > 0) {\n await sleep(retryDelayMs);\n }\n } finally {\n release();\n }\n }\n\n throw new ApiError(\"Request attempts exhausted.\", {\n endpoint: config.endpoint,\n method: config.method,\n request: requestMetadata,\n headers: {},\n retryAfter: null,\n requestId,\n });\n }\n\n private createRequestId(): string {\n this.requestCounter += 1;\n return `${Date.now().toString(36)}-${this.requestCounter.toString(36)}`;\n }\n\n private createApiError(\n endpoint: EndpointName,\n method: HttpMethod,\n url: string,\n options: RequestOptions | undefined,\n safeRequestHeaders: Readonly<Record<string, string>>,\n statusCode: number,\n headers: Readonly<Record<string, string>>,\n body: unknown,\n retryAfter: number | null,\n requestId: string | undefined,\n ): ApiError {\n const request = this.createRequestMetadata(method, url, options, safeRequestHeaders);\n const metadata = {\n endpoint,\n method,\n request,\n statusCode,\n headers,\n body,\n retryAfter,\n requestId,\n };\n\n if (statusCode === 429) {\n return new RateLimitError(\"Rate limit exceeded.\", metadata);\n }\n\n if (statusCode >= 400 && statusCode < 500) {\n return new ClientError(`API request failed with status ${statusCode}.`, metadata);\n }\n\n return new ApiError(`API request failed with status ${statusCode}.`, metadata);\n }\n\n private async emitError(\n hooks: NormalizedHooks,\n context: {\n endpoint: EndpointName;\n method: HttpMethod;\n url: string;\n attempt: number;\n requestId: string;\n durationMs: number;\n willRetry: boolean;\n error: ApiError;\n },\n ): Promise<void> {\n await this.observability.emitRequestError({\n requestId: context.requestId,\n endpoint: context.endpoint,\n method: context.method,\n url: context.url,\n attempt: context.attempt,\n durationMs: context.durationMs,\n willRetry: context.willRetry,\n error: context.error,\n });\n\n for (const hook of hooks.onError) {\n await hook(context);\n }\n }\n\n private resolveValidationMode(\n mode: ValidationMode | undefined,\n deprecatedValidateFlag: boolean | undefined,\n fallbackMode: ValidationMode = \"warn\",\n ): ValidationMode {\n if (mode !== undefined) {\n return mode;\n }\n\n if (deprecatedValidateFlag === undefined) {\n return fallbackMode;\n }\n\n return deprecatedValidateFlag ? \"strict\" : \"off\";\n }\n\n private createRequestMetadata(\n method: HttpMethod,\n url: string,\n options: RequestOptions | undefined,\n safeHeaders: Readonly<Record<string, string>>,\n ): {\n method: HttpMethod;\n url: string;\n options?: {\n timeoutMs?: number | undefined;\n retries?: number | Partial<RetryOptions> | undefined;\n cache?: boolean | RequestCacheOptions | undefined;\n validation?: ValidationMode | undefined;\n headers?: Readonly<Record<string, string>> | undefined;\n } | undefined;\n } {\n if (!options) {\n return { method, url };\n }\n\n return {\n method,\n url,\n options: {\n timeoutMs: options.timeoutMs,\n retries: options.retries,\n cache: options.cache,\n validation: this.resolveValidationMode(\n options.validation,\n options.validateResponse,\n this.validationMode,\n ),\n headers: Object.keys(safeHeaders).length > 0 ? safeHeaders : undefined,\n },\n };\n }\n\n private resolveCacheSettings(cache: boolean | CacheOptions | undefined): ResolvedCacheSettings {\n if (cache === false) {\n return {\n enabled: false,\n maxSize: 0,\n ttlMs: 0,\n endpointTtlMs: {},\n };\n }\n\n if (cache === true || cache === undefined) {\n return {\n enabled: cache === true,\n maxSize: 500,\n ttlMs: 30_000,\n endpointTtlMs: {},\n };\n }\n\n return {\n enabled: true,\n maxSize: cache.maxSize ?? 500,\n ttlMs: cache.ttlMs ?? 30_000,\n endpointTtlMs: cache.endpointTtlMs ?? {},\n };\n }\n\n private resolveCachePolicy(\n endpoint: EndpointName,\n requestCache: boolean | RequestCacheOptions | undefined,\n ): ResolvedCachePolicy {\n if (!this.cacheSettings.enabled || this.cache === null) {\n return { enabled: false, ttlMs: 0 };\n }\n\n if (requestCache === false) {\n return { enabled: false, ttlMs: 0 };\n }\n\n const endpointTtlMs = this.cacheSettings.endpointTtlMs[endpoint];\n const ttlMs =\n typeof requestCache === \"object\" && requestCache.ttlMs !== undefined\n ? requestCache.ttlMs\n : endpointTtlMs ?? this.cacheSettings.ttlMs;\n\n const enabled =\n requestCache === true\n || requestCache === undefined\n || (typeof requestCache === \"object\" && requestCache.enabled !== false);\n\n return {\n enabled,\n ttlMs,\n };\n }\n\n private isCacheableMethod(method: HttpMethod): boolean {\n return method === \"GET\";\n }\n\n private trackEndpointCacheKey(endpoint: EndpointName, cacheKey: string): void {\n const existing = this.endpointCacheIndex.get(endpoint);\n if (existing) {\n existing.add(cacheKey);\n return;\n }\n\n this.endpointCacheIndex.set(endpoint, new Set([cacheKey]));\n }\n\n private async waitForRateLimitWindow(routeKey: string): Promise<void> {\n const now = Date.now();\n const routeLimit = this.routeRateLimitUntilMs.get(routeKey) ?? 0;\n const nextAllowedAtMs = Math.max(this.globalRateLimitUntilMs, routeLimit);\n\n if (nextAllowedAtMs <= now) {\n return;\n }\n\n await sleep(nextAllowedAtMs - now);\n }\n\n private updateRateLimitState(headers: Headers, statusCode: number, routeKey: string): void {\n const delayMs = parseRateLimitDelayMs(headers);\n if (delayMs === undefined) {\n return;\n }\n\n const shouldUpdate = statusCode === 429 || isRateLimitExhausted(headers);\n if (!shouldUpdate) {\n return;\n }\n\n const updateUntil = Date.now() + delayMs;\n const scope = parseRateLimitScope(headers);\n\n if (scope === \"global\") {\n this.globalRateLimitUntilMs = Math.max(this.globalRateLimitUntilMs, updateUntil);\n return;\n }\n\n const currentRouteLimit = this.routeRateLimitUntilMs.get(routeKey) ?? 0;\n this.routeRateLimitUntilMs.set(routeKey, Math.max(currentRouteLimit, updateUntil));\n }\n\n private async parseResponseBody(response: Response): Promise<unknown> {\n if (response.status === 204) {\n return undefined;\n }\n\n const contentType = response.headers.get(\"content-type\")?.toLowerCase() ?? \"\";\n\n if (contentType.includes(\"application/json\")) {\n try {\n return (await response.json()) as unknown;\n } catch {\n return undefined;\n }\n }\n\n const text = await response.text();\n if (!text) {\n return undefined;\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n }\n}\n","/**\n * Check if value is a plain object record.\n */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Check if value is a string.\n */\nexport function isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Check if value is a finite number.\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\n/**\n * Check if value is a boolean.\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === \"boolean\";\n}\n\n/**\n * Check if value is a string map.\n */\nexport function isStringMap(value: unknown): value is Record<string, string> {\n if (!isRecord(value)) {\n return false;\n }\n\n return Object.values(value).every((entry) => typeof entry === \"string\");\n}\n\n/**\n * Check if value is an array with items validated by guard.\n */\nexport function isArrayOf<T>(\n value: unknown,\n guard: (entry: unknown) => entry is T,\n): value is T[] {\n return Array.isArray(value) && value.every((entry) => guard(entry));\n}\n","import type { ApiListResponse, Paging } from \"../types/api.js\";\nimport { isArrayOf, isRecord, isString } from \"./guards.js\";\n\nfunction isPaging(value: unknown): value is Paging {\n if (!isRecord(value)) {\n return false;\n }\n\n if (value.cursors === undefined) {\n return true;\n }\n\n if (!isRecord(value.cursors)) {\n return false;\n }\n\n const before = value.cursors.before;\n const after = value.cursors.after;\n\n return (before === undefined || isString(before)) && (after === undefined || isString(after));\n}\n\n/**\n * Normalize list payloads to `{ items, paging }`.\n */\nexport function normalizeListResponse<TItem>(\n payload: unknown,\n itemGuard: (value: unknown) => value is TItem,\n): ApiListResponse<TItem> {\n if (isArrayOf(payload, itemGuard)) {\n return { items: payload };\n }\n\n if (!isRecord(payload)) {\n throw new Error(\"Expected list response object or array.\");\n }\n\n const items = payload.items;\n if (!isArrayOf(items, itemGuard)) {\n throw new Error(\"Expected `items` array in list response.\");\n }\n\n const paging = payload.paging;\n if (paging !== undefined && !isPaging(paging)) {\n throw new Error(\"Invalid `paging` object in list response.\");\n }\n\n return {\n items,\n paging,\n };\n}\n","import type {\n Accessory,\n Brawler,\n BrawlerBuffies,\n BrawlerStat,\n Club,\n ClubMember,\n ClubRanking,\n Event,\n EventType,\n HyperCharge,\n JsonLocalizedName,\n Player,\n PlayerClub,\n PlayerIcon,\n PlayerRanking,\n PlayerRankingClub,\n ScheduledEvent,\n ScheduledEventLocation,\n Skin,\n StarPower,\n GearStat,\n Battle,\n} from \"../types/api.js\";\nimport { isArrayOf, isBoolean, isNumber, isRecord, isString, isStringMap } from \"./guards.js\";\n\nfunction hasString(record: Record<string, unknown>, key: string): boolean {\n return isString(record[key]);\n}\n\nfunction hasNumber(record: Record<string, unknown>, key: string): boolean {\n return isNumber(record[key]);\n}\n\nfunction hasBoolean(record: Record<string, unknown>, key: string): boolean {\n return isBoolean(record[key]);\n}\n\n/**\n * Runtime guard for localized names.\n */\nexport function isJsonLocalizedName(value: unknown): value is JsonLocalizedName {\n return isStringMap(value);\n}\n\n/**\n * Runtime guard for player icons.\n */\nexport function isPlayerIcon(value: unknown): value is PlayerIcon {\n if (!isRecord(value)) {\n return false;\n }\n\n return hasNumber(value, \"id\");\n}\n\n/**\n * Runtime guard for accessory entries.\n */\nexport function isAccessory(value: unknown): value is Accessory {\n if (!isRecord(value)) {\n return false;\n }\n\n return hasNumber(value, \"id\") && isJsonLocalizedName(value.name);\n}\n\n/**\n * Runtime guard for star powers.\n */\nexport function isStarPower(value: unknown): value is StarPower {\n if (!isRecord(value)) {\n return false;\n }\n\n return hasNumber(value, \"id\") && isJsonLocalizedName(value.name);\n}\n\n/**\n * Runtime guard for hyper charges.\n */\nexport function isHyperCharge(value: unknown): value is HyperCharge {\n if (!isRecord(value)) {\n return false;\n }\n\n return hasNumber(value, \"id\") && isJsonLocalizedName(value.name);\n}\n\n/**\n * Runtime guard for gear stats.\n */\nexport function isGearStat(value: unknown): value is GearStat {\n if (!isRecord(value)) {\n return false;\n }\n\n return hasNumber(value, \"id\") && hasNumber(value, \"level\") && isJsonLocalizedName(value.name);\n}\n\n/**\n * Runtime guard for skins.\n */\nexport function isSkin(value: unknown): value is Skin {\n if (!isRecord(value)) {\n return false;\n }\n\n return hasNumber(value, \"id\") && isJsonLocalizedName(value.name);\n}\n\n/**\n * Runtime guard for brawler buff flags.\n */\nexport function isBrawlerBuffies(value: unknown): value is BrawlerBuffies {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n hasBoolean(value, \"gadget\") &&\n hasBoolean(value, \"starPower\") &&\n hasBoolean(value, \"hyperCharge\")\n );\n}\n\n/**\n * Runtime guard for brawler stats in player payloads.\n */\nexport function isBrawlerStat(value: unknown): value is BrawlerStat {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n hasNumber(value, \"id\") &&\n hasNumber(value, \"rank\") &&\n hasNumber(value, \"trophies\") &&\n hasNumber(value, \"highestTrophies\") &&\n hasNumber(value, \"prestigeLevel\") &&\n hasNumber(value, \"power\") &&\n hasNumber(value, \"currentWinStreak\") &&\n hasNumber(value, \"maxWinStreak\") &&\n isJsonLocalizedName(value.name) &&\n isArrayOf(value.gadgets, isAccessory) &&\n isArrayOf(value.starPowers, isStarPower) &&\n isArrayOf(value.hyperCharges, isHyperCharge) &&\n isArrayOf(value.gears, isGearStat) &&\n isBrawlerBuffies(value.buffies) &&\n isSkin(value.skin)\n );\n}\n\n/**\n * Runtime guard for player clubs.\n */\nexport function isPlayerClub(value: unknown): value is PlayerClub {\n if (!isRecord(value)) {\n return false;\n }\n\n return hasString(value, \"tag\") && hasString(value, \"name\");\n}\n\n/**\n * Runtime guard for players.\n */\nexport function isPlayer(value: unknown): value is Player {\n if (!isRecord(value)) {\n return false;\n }\n\n const hasClub = value.club === undefined || isPlayerClub(value.club);\n\n return (\n hasString(value, \"tag\") &&\n hasString(value, \"name\") &&\n hasString(value, \"nameColor\") &&\n isPlayerIcon(value.icon) &&\n hasClub &&\n hasNumber(value, \"trophies\") &&\n hasNumber(value, \"highestTrophies\") &&\n hasNumber(value, \"totalPrestigeLevel\") &&\n hasNumber(value, \"expLevel\") &&\n hasNumber(value, \"expPoints\") &&\n hasNumber(value, \"soloVictories\") &&\n hasNumber(value, \"duoVictories\") &&\n hasNumber(value, \"bestRoboRumbleTime\") &&\n hasNumber(value, \"bestTimeAsBigBrawler\") &&\n hasBoolean(value, \"isQualifiedFromChampionshipChallenge\") &&\n hasNumber(value, \"3vs3Victories\") &&\n isArrayOf(value.brawlers, isBrawlerStat)\n );\n}\n\n/**\n * Runtime guard for club members.\n */\nexport function isClubMember(value: unknown): value is ClubMember {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n hasString(value, \"tag\") &&\n hasString(value, \"name\") &&\n hasString(value, \"nameColor\") &&\n hasNumber(value, \"trophies\") &&\n hasString(value, \"role\") &&\n isPlayerIcon(value.icon)\n );\n}\n\n/**\n * Runtime guard for clubs.\n */\nexport function isClub(value: unknown): value is Club {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n hasString(value, \"tag\") &&\n hasString(value, \"name\") &&\n hasString(value, \"description\") &&\n hasNumber(value, \"trophies\") &&\n hasNumber(value, \"requiredTrophies\") &&\n isArrayOf(value.members, isClubMember) &&\n hasString(value, \"type\") &&\n hasNumber(value, \"badgeId\") &&\n hasBoolean(value, \"isFamilyFriendly\")\n );\n}\n\n/**\n * Runtime guard for club rankings.\n */\nexport function isClubRanking(value: unknown): value is ClubRanking {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n hasString(value, \"tag\") &&\n hasString(value, \"name\") &&\n hasNumber(value, \"trophies\") &&\n hasNumber(value, \"rank\") &&\n hasNumber(value, \"memberCount\") &&\n hasNumber(value, \"badgeId\")\n );\n}\n\n/**\n * Runtime guard for ranking club payload.\n */\nexport function isPlayerRankingClub(value: unknown): value is PlayerRankingClub {\n if (!isRecord(value)) {\n return false;\n }\n\n return hasString(value, \"name\");\n}\n\n/**\n * Runtime guard for player rankings.\n */\nexport function isPlayerRanking(value: unknown): value is PlayerRanking {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n hasString(value, \"tag\") &&\n hasString(value, \"name\") &&\n hasString(value, \"nameColor\") &&\n hasNumber(value, \"rank\") &&\n hasNumber(value, \"trophies\") &&\n isPlayerIcon(value.icon) &&\n isPlayerRankingClub(value.club)\n );\n}\n\n/**\n * Runtime guard for brawler metadata.\n */\nexport function isBrawler(value: unknown): value is Brawler {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n hasNumber(value, \"id\") &&\n isJsonLocalizedName(value.name) &&\n isArrayOf(value.gadgets, isAccessory) &&\n isArrayOf(value.starPowers, isStarPower) &&\n isArrayOf(value.hyperCharges, isHyperCharge) &&\n isArrayOf(value.gears, isGearStat)\n );\n}\n\n/**\n * Runtime guard for game mode descriptors.\n */\nexport function isEventType(value: unknown): value is EventType {\n if (!isRecord(value)) {\n return false;\n }\n\n return hasNumber(value, \"id\") && isJsonLocalizedName(value.name);\n}\n\n/**\n * Runtime guard for scheduled event locations.\n */\nexport function isScheduledEventLocation(value: unknown): value is ScheduledEventLocation {\n if (!isRecord(value)) {\n return false;\n }\n\n const modifiers = value.modifiers;\n const modifiersValid =\n modifiers === undefined || (Array.isArray(modifiers) && modifiers.every((entry) => isString(entry)));\n\n return (\n hasNumber(value, \"id\") &&\n hasNumber(value, \"modeId\") &&\n hasString(value, \"mode\") &&\n isJsonLocalizedName(value.map) &&\n modifiersValid\n );\n}\n\n/**\n * Runtime guard for scheduled events.\n */\nexport function isScheduledEvent(value: unknown): value is ScheduledEvent {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n hasNumber(value, \"slotId\") &&\n hasString(value, \"startTime\") &&\n hasString(value, \"endTime\") &&\n isScheduledEventLocation(value.event)\n );\n}\n\n/**\n * Runtime guard for battle events.\n */\nexport function isEvent(value: unknown): value is Event {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n hasNumber(value, \"id\") &&\n hasNumber(value, \"modeId\") &&\n hasString(value, \"mode\") &&\n isJsonLocalizedName(value.map)\n );\n}\n\n/**\n * Runtime guard for battle log entries.\n */\nexport function isBattle(value: unknown): value is Battle {\n if (!isRecord(value)) {\n return false;\n }\n\n return hasString(value, \"battleTime\") && isRecord(value.battle) && isEvent(value.event);\n}\n","import type {\n ApiListResponse,\n Battle,\n BattleLogResponse,\n Brawler,\n BrawlersResponse,\n Club,\n ClubMember,\n ClubMembersResponse,\n ClubRanking,\n ClubRankingsResponse,\n EventRotationResponse,\n EventType,\n GameModesResponse,\n Player,\n PlayerRanking,\n PlayerRankingsResponse,\n ScheduledEvent,\n} from \"../types/api.js\";\nimport type { EndpointName } from \"../types/client.js\";\nimport { isRecord } from \"../validation/guards.js\";\nimport { normalizeListResponse } from \"../validation/list-response.js\";\nimport {\n isBattle,\n isBrawler,\n isClub,\n isClubMember,\n isClubRanking,\n isEventType,\n isPlayer,\n isPlayerRanking,\n isScheduledEvent,\n} from \"../validation/validators.js\";\n\n/**\n * Endpoint parser function with optional runtime validation.\n */\nexport type EndpointParser<TResponse> = (payload: unknown, validate: boolean) => TResponse;\n\n/**\n * Endpoint parser map used by the core HTTP layer.\n */\nexport interface EndpointParserMap {\n \"players.get\": EndpointParser<Player>;\n \"players.getBattleLog\": EndpointParser<BattleLogResponse>;\n \"clubs.get\": EndpointParser<Club>;\n \"clubs.getMembers\": EndpointParser<ClubMembersResponse>;\n \"rankings.getClubs\": EndpointParser<ClubRankingsResponse>;\n \"rankings.getPlayers\": EndpointParser<PlayerRankingsResponse>;\n \"rankings.getBrawlers\": EndpointParser<PlayerRankingsResponse>;\n \"brawlers.list\": EndpointParser<BrawlersResponse>;\n \"brawlers.get\": EndpointParser<Brawler>;\n \"gamemodes.list\": EndpointParser<GameModesResponse>;\n \"events.getRotation\": EndpointParser<EventRotationResponse>;\n}\n\nfunction parseSingle<TResponse>(\n endpoint: EndpointName,\n payload: unknown,\n validate: boolean,\n guard: (value: unknown) => value is TResponse,\n): TResponse {\n if (!validate) {\n return payload as TResponse;\n }\n\n if (!guard(payload)) {\n throw new Error(`Response validation failed for endpoint '${endpoint}'.`);\n }\n\n return payload;\n}\n\nfunction normalizeListWithoutValidation<TItem>(payload: unknown): ApiListResponse<TItem> {\n if (Array.isArray(payload)) {\n return { items: payload as TItem[] };\n }\n\n if (!isRecord(payload)) {\n throw new Error(\"Expected list response object or array.\");\n }\n\n if (!Array.isArray(payload.items)) {\n throw new Error(\"Expected `items` array in list response.\");\n }\n\n if (payload.paging !== undefined && !isRecord(payload.paging)) {\n throw new Error(\"Invalid `paging` value in list response.\");\n }\n\n return {\n items: payload.items as TItem[],\n paging: payload.paging as ApiListResponse<TItem>[\"paging\"],\n };\n}\n\nfunction parseList<TItem>(\n endpoint: EndpointName,\n payload: unknown,\n validate: boolean,\n guard: (value: unknown) => value is TItem,\n): ApiListResponse<TItem> {\n if (!validate) {\n return normalizeListWithoutValidation(payload);\n }\n\n try {\n return normalizeListResponse(payload, guard);\n } catch (error) {\n throw new Error(\n `Response validation failed for endpoint '${endpoint}': ${(error as Error).message}`,\n );\n }\n}\n\n/**\n * Strongly-typed response parsers for all public API methods.\n */\nexport const endpointParsers: EndpointParserMap = {\n \"players.get\": (payload, validate) => parseSingle(\"players.get\", payload, validate, isPlayer),\n \"players.getBattleLog\": (payload, validate) =>\n parseList<Battle>(\"players.getBattleLog\", payload, validate, isBattle),\n \"clubs.get\": (payload, validate) => parseSingle(\"clubs.get\", payload, validate, isClub),\n \"clubs.getMembers\": (payload, validate) =>\n parseList<ClubMember>(\"clubs.getMembers\", payload, validate, isClubMember),\n \"rankings.getClubs\": (payload, validate) =>\n parseList<ClubRanking>(\"rankings.getClubs\", payload, validate, isClubRanking),\n \"rankings.getPlayers\": (payload, validate) =>\n parseList<PlayerRanking>(\"rankings.getPlayers\", payload, validate, isPlayerRanking),\n \"rankings.getBrawlers\": (payload, validate) =>\n parseList<PlayerRanking>(\"rankings.getBrawlers\", payload, validate, isPlayerRanking),\n \"brawlers.list\": (payload, validate) => parseList<Brawler>(\"brawlers.list\", payload, validate, isBrawler),\n \"brawlers.get\": (payload, validate) => parseSingle(\"brawlers.get\", payload, validate, isBrawler),\n \"gamemodes.list\": (payload, validate) =>\n parseList<EventType>(\"gamemodes.list\", payload, validate, isEventType),\n \"events.getRotation\": (payload, validate) =>\n parseList<ScheduledEvent>(\"events.getRotation\", payload, validate, isScheduledEvent),\n};\n","import type { CursorPaginationQuery } from \"../types/api.js\";\n\n/**\n * Validate cursor pagination parameters and normalize query payload.\n */\nexport function normalizeCursorPaginationQuery(\n query: CursorPaginationQuery | undefined,\n): Readonly<Record<string, string | number | boolean | undefined>> | undefined {\n if (!query) {\n return undefined;\n }\n\n const hasBefore = typeof query.before === \"string\" && query.before.length > 0;\n const hasAfter = typeof query.after === \"string\" && query.after.length > 0;\n\n if (hasBefore && hasAfter) {\n throw new Error(\"Only one of `before` or `after` can be provided.\");\n }\n\n if (query.limit !== undefined) {\n if (!Number.isInteger(query.limit) || query.limit <= 0) {\n throw new Error(\"`limit` must be a positive integer when provided.\");\n }\n }\n\n return {\n before: hasBefore ? query.before : undefined,\n after: hasAfter ? query.after : undefined,\n limit: query.limit,\n };\n}\n","import type { CursorPaginationQuery } from \"../types/api.js\";\nimport type { RequestOptions, ValidationMode } from \"../types/client.js\";\n\ninterface PaginatedResolution {\n query: CursorPaginationQuery | undefined;\n requestOptions: RequestOptions | undefined;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isValidationMode(value: unknown): value is ValidationMode {\n return value === \"off\" || value === \"warn\" || value === \"strict\";\n}\n\n/**\n * Resolve modern and legacy arguments for paginated endpoint methods.\n */\nexport function resolvePaginatedArgs(\n first:\n | (RequestOptions & CursorPaginationQuery)\n | CursorPaginationQuery\n | undefined,\n second?: RequestOptions,\n): PaginatedResolution {\n if (second !== undefined) {\n return {\n query: first as CursorPaginationQuery | undefined,\n requestOptions: second,\n };\n }\n\n if (!first) {\n return {\n query: undefined,\n requestOptions: undefined,\n };\n }\n\n if (!isObject(first)) {\n return {\n query: undefined,\n requestOptions: undefined,\n };\n }\n\n const query: CursorPaginationQuery = {\n before: typeof first.before === \"string\" ? first.before : undefined,\n after: typeof first.after === \"string\" ? first.after : undefined,\n limit: typeof first.limit === \"number\" ? first.limit : undefined,\n };\n\n const requestOptions: RequestOptions = {\n timeoutMs: typeof first.timeoutMs === \"number\" ? first.timeoutMs : undefined,\n retries:\n typeof first.retries === \"number\" || isObject(first.retries)\n ? first.retries\n : undefined,\n signal: first.signal instanceof AbortSignal ? first.signal : undefined,\n headers: first.headers as HeadersInit | undefined,\n cache:\n typeof first.cache === \"boolean\" || isObject(first.cache)\n ? first.cache\n : undefined,\n validation: isValidationMode(first.validation) ? first.validation : undefined,\n validateResponse:\n typeof first.validateResponse === \"boolean\" ? first.validateResponse : undefined,\n hooks: isObject(first.hooks) ? (first.hooks as RequestOptions[\"hooks\"]) : undefined,\n };\n\n const hasQuery =\n query.before !== undefined\n || query.after !== undefined\n || query.limit !== undefined;\n\n const hasRequestOptions =\n requestOptions.timeoutMs !== undefined\n || requestOptions.retries !== undefined\n || requestOptions.signal !== undefined\n || requestOptions.headers !== undefined\n || requestOptions.cache !== undefined\n || requestOptions.validation !== undefined\n || requestOptions.validateResponse !== undefined\n || requestOptions.hooks !== undefined;\n\n return {\n query: hasQuery ? query : undefined,\n requestOptions: hasRequestOptions ? requestOptions : undefined,\n };\n}\n","import type {\n Brawler,\n BrawlerId,\n BrawlersResponse,\n CursorPaginationQuery,\n} from \"../types/api.js\";\nimport type { RequestOptions } from \"../types/client.js\";\nimport type {\n GetBrawlerOptions,\n ListBrawlersOptions,\n} from \"../types/method-options.js\";\nimport type { HttpClient } from \"../internal/http-client.js\";\nimport { endpointParsers } from \"../internal/response-parsers.js\";\nimport { normalizeCursorPaginationQuery } from \"../utils/pagination.js\";\nimport { resolvePaginatedArgs } from \"../utils/options.js\";\n\n/**\n * Brawler endpoint group.\n */\nexport class BrawlersResource {\n public constructor(private readonly http: HttpClient) {}\n\n /**\n * List all brawlers.\n */\n public list(opts?: ListBrawlersOptions): Promise<BrawlersResponse>;\n /**\n * @deprecated Use `list(opts?)`.\n */\n public list(query?: CursorPaginationQuery, opts?: RequestOptions): Promise<BrawlersResponse>;\n public list(\n optsOrQuery?: ListBrawlersOptions | CursorPaginationQuery,\n legacyOpts?: RequestOptions,\n ): Promise<BrawlersResponse> {\n const { query, requestOptions } = resolvePaginatedArgs(optsOrQuery, legacyOpts);\n\n return this.http.request({\n endpoint: \"brawlers.list\",\n method: \"GET\",\n path: \"/brawlers\",\n query: normalizeCursorPaginationQuery(query),\n options: requestOptions,\n parser: endpointParsers[\"brawlers.list\"],\n });\n }\n\n /**\n * Get one brawler by identifier.\n */\n public get(brawlerId: BrawlerId, opts?: GetBrawlerOptions): Promise<Brawler> {\n return this.http.request({\n endpoint: \"brawlers.get\",\n method: \"GET\",\n path: `/brawlers/${encodeURIComponent(String(brawlerId))}`,\n options: opts,\n parser: endpointParsers[\"brawlers.get\"],\n });\n }\n}\n","import type { EntityTag } from \"../types/api.js\";\n\n/**\n * Options for tag encoding.\n */\nexport interface EncodeTagOptions {\n uppercase?: boolean | undefined;\n}\n\n/**\n * Normalize a player/club tag and encode it for use inside API paths.\n */\nexport function encodeTag(tag: EntityTag, options?: EncodeTagOptions): string {\n const uppercase = options?.uppercase ?? true;\n const compactTag = String(tag).replace(/\\s+/gu, \"\");\n const normalizedTag = uppercase ? compactTag.toUpperCase() : compactTag;\n const prefixedTag = normalizedTag.startsWith(\"#\") ? normalizedTag : `#${normalizedTag}`;\n\n return encodeURIComponent(prefixedTag);\n}\n","import type {\n Club,\n ClubMembersResponse,\n CursorPaginationQuery,\n EntityTag,\n} from \"../types/api.js\";\nimport type { RequestOptions } from \"../types/client.js\";\nimport type {\n GetClubMembersOptions,\n GetClubOptions,\n} from \"../types/method-options.js\";\nimport type { HttpClient } from \"../internal/http-client.js\";\nimport { endpointParsers } from \"../internal/response-parsers.js\";\nimport { normalizeCursorPaginationQuery } from \"../utils/pagination.js\";\nimport { resolvePaginatedArgs } from \"../utils/options.js\";\nimport { encodeTag } from \"../utils/tag.js\";\n\n/**\n * Club endpoint group.\n */\nexport class ClubsResource {\n public constructor(private readonly http: HttpClient) {}\n\n /**\n * Get full club details by tag.\n */\n public get(clubTag: EntityTag, opts?: GetClubOptions): Promise<Club> {\n return this.http.request({\n endpoint: \"clubs.get\",\n method: \"GET\",\n path: `/clubs/${encodeTag(clubTag)}`,\n options: opts,\n parser: endpointParsers[\"clubs.get\"],\n });\n }\n\n /**\n * List members for a club with optional cursor pagination.\n */\n public getMembers(clubTag: EntityTag, opts?: GetClubMembersOptions): Promise<ClubMembersResponse>;\n /**\n * @deprecated Use `getMembers(clubTag, opts?)`.\n */\n public getMembers(\n clubTag: EntityTag,\n query?: CursorPaginationQuery,\n opts?: RequestOptions,\n ): Promise<ClubMembersResponse>;\n public getMembers(\n clubTag: EntityTag,\n optsOrQuery?: GetClubMembersOptions | CursorPaginationQuery,\n legacyOpts?: RequestOptions,\n ): Promise<ClubMembersResponse> {\n const { query, requestOptions } = resolvePaginatedArgs(optsOrQuery, legacyOpts);\n\n return this.http.request({\n endpoint: \"clubs.getMembers\",\n method: \"GET\",\n path: `/clubs/${encodeTag(clubTag)}/members`,\n query: normalizeCursorPaginationQuery(query),\n options: requestOptions,\n parser: endpointParsers[\"clubs.getMembers\"],\n });\n }\n}\n","import type { EventRotationResponse } from \"../types/api.js\";\nimport type { GetEventRotationOptions } from \"../types/method-options.js\";\nimport type { HttpClient } from \"../internal/http-client.js\";\nimport { endpointParsers } from \"../internal/response-parsers.js\";\n\n/**\n * Events endpoint group.\n */\nexport class EventsResource {\n public constructor(private readonly http: HttpClient) {}\n\n /**\n * Get currently active event rotation.\n */\n public getRotation(opts?: GetEventRotationOptions): Promise<EventRotationResponse> {\n return this.http.request({\n endpoint: \"events.getRotation\",\n method: \"GET\",\n path: \"/events/rotation\",\n options: opts,\n parser: endpointParsers[\"events.getRotation\"],\n });\n }\n}\n","import type { CursorPaginationQuery, GameModesResponse } from \"../types/api.js\";\nimport type { RequestOptions } from \"../types/client.js\";\nimport type { ListGameModesOptions } from \"../types/method-options.js\";\nimport type { HttpClient } from \"../internal/http-client.js\";\nimport { endpointParsers } from \"../internal/response-parsers.js\";\nimport { resolvePaginatedArgs } from \"../utils/options.js\";\nimport { normalizeCursorPaginationQuery } from \"../utils/pagination.js\";\n\n/**\n * Game modes endpoint group.\n */\nexport class GameModesResource {\n public constructor(private readonly http: HttpClient) {}\n\n /**\n * List available game modes.\n */\n public list(opts?: ListGameModesOptions): Promise<GameModesResponse>;\n /**\n * @deprecated Use `list(opts?)`.\n */\n public list(query?: CursorPaginationQuery, opts?: RequestOptions): Promise<GameModesResponse>;\n public list(\n optsOrQuery?: ListGameModesOptions | CursorPaginationQuery,\n legacyOpts?: RequestOptions,\n ): Promise<GameModesResponse> {\n const { query, requestOptions } = resolvePaginatedArgs(optsOrQuery, legacyOpts);\n\n return this.http.request({\n endpoint: \"gamemodes.list\",\n method: \"GET\",\n path: \"/gamemodes\",\n query: normalizeCursorPaginationQuery(query),\n options: requestOptions,\n parser: endpointParsers[\"gamemodes.list\"],\n });\n }\n}\n","import type { BattleLogResponse, EntityTag, Player } from \"../types/api.js\";\nimport type {\n GetPlayerBattleLogOptions,\n GetPlayerOptions,\n} from \"../types/method-options.js\";\nimport type { HttpClient } from \"../internal/http-client.js\";\nimport { endpointParsers } from \"../internal/response-parsers.js\";\nimport { encodeTag } from \"../utils/tag.js\";\n\n/**\n * Player endpoint group.\n */\nexport class PlayersResource {\n public constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a player profile by tag.\n *\n * @example\n * const player = await client.players.get(\"#2PP\");\n */\n public get(playerTag: EntityTag, opts?: GetPlayerOptions): Promise<Player> {\n return this.http.request({\n endpoint: \"players.get\",\n method: \"GET\",\n path: `/players/${encodeTag(playerTag)}`,\n options: opts,\n parser: endpointParsers[\"players.get\"],\n });\n }\n\n /**\n * Get recent battle log entries for a player.\n *\n * @example\n * const battles = await client.players.getBattleLog(\"#2PP\");\n */\n public getBattleLog(\n playerTag: EntityTag,\n opts?: GetPlayerBattleLogOptions,\n ): Promise<BattleLogResponse> {\n return this.http.request({\n endpoint: \"players.getBattleLog\",\n method: \"GET\",\n path: `/players/${encodeTag(playerTag)}/battlelog`,\n options: opts,\n parser: endpointParsers[\"players.getBattleLog\"],\n });\n }\n}\n","import type {\n BrawlerId,\n ClubRankingsResponse,\n CountryCode,\n CursorPaginationQuery,\n PlayerRankingsResponse,\n} from \"../types/api.js\";\nimport type { RequestOptions } from \"../types/client.js\";\nimport type {\n GetBrawlerRankingsOptions,\n GetClubRankingsOptions,\n GetPlayerRankingsOptions,\n} from \"../types/method-options.js\";\nimport type { HttpClient } from \"../internal/http-client.js\";\nimport { endpointParsers } from \"../internal/response-parsers.js\";\nimport { resolvePaginatedArgs } from \"../utils/options.js\";\nimport { normalizeCursorPaginationQuery } from \"../utils/pagination.js\";\n\n/**\n * Ranking endpoint group.\n */\nexport class RankingsResource {\n public constructor(private readonly http: HttpClient) {}\n\n /**\n * Get club rankings for a country or globally.\n */\n public getClubs(\n countryCode: CountryCode,\n opts?: GetClubRankingsOptions,\n ): Promise<ClubRankingsResponse>;\n /**\n * @deprecated Use `getClubs(countryCode, opts?)`.\n */\n public getClubs(\n countryCode: CountryCode,\n query?: CursorPaginationQuery,\n opts?: RequestOptions,\n ): Promise<ClubRankingsResponse>;\n public getClubs(\n countryCode: CountryCode,\n optsOrQuery?: GetClubRankingsOptions | CursorPaginationQuery,\n legacyOpts?: RequestOptions,\n ): Promise<ClubRankingsResponse> {\n const { query, requestOptions } = resolvePaginatedArgs(optsOrQuery, legacyOpts);\n\n return this.http.request({\n endpoint: \"rankings.getClubs\",\n method: \"GET\",\n path: `/rankings/${encodeURIComponent(countryCode)}/clubs`,\n query: normalizeCursorPaginationQuery(query),\n options: requestOptions,\n parser: endpointParsers[\"rankings.getClubs\"],\n });\n }\n\n /**\n * Get player rankings for a country or globally.\n */\n public getPlayers(\n countryCode: CountryCode,\n opts?: GetPlayerRankingsOptions,\n ): Promise<PlayerRankingsResponse>;\n /**\n * @deprecated Use `getPlayers(countryCode, opts?)`.\n */\n public getPlayers(\n countryCode: CountryCode,\n query?: CursorPaginationQuery,\n opts?: RequestOptions,\n ): Promise<PlayerRankingsResponse>;\n public getPlayers(\n countryCode: CountryCode,\n optsOrQuery?: GetPlayerRankingsOptions | CursorPaginationQuery,\n legacyOpts?: RequestOptions,\n ): Promise<PlayerRankingsResponse> {\n const { query, requestOptions } = resolvePaginatedArgs(optsOrQuery, legacyOpts);\n\n return this.http.request({\n endpoint: \"rankings.getPlayers\",\n method: \"GET\",\n path: `/rankings/${encodeURIComponent(countryCode)}/players`,\n query: normalizeCursorPaginationQuery(query),\n options: requestOptions,\n parser: endpointParsers[\"rankings.getPlayers\"],\n });\n }\n\n /**\n * Get rankings for one brawler in a country or globally.\n */\n public getBrawlers(\n countryCode: CountryCode,\n brawlerId: BrawlerId,\n opts?: GetBrawlerRankingsOptions,\n ): Promise<PlayerRankingsResponse>;\n /**\n * @deprecated Use `getBrawlers(countryCode, brawlerId, opts?)`.\n */\n public getBrawlers(\n countryCode: CountryCode,\n brawlerId: BrawlerId,\n query?: CursorPaginationQuery,\n opts?: RequestOptions,\n ): Promise<PlayerRankingsResponse>;\n public getBrawlers(\n countryCode: CountryCode,\n brawlerId: BrawlerId,\n optsOrQuery?: GetBrawlerRankingsOptions | CursorPaginationQuery,\n legacyOpts?: RequestOptions,\n ): Promise<PlayerRankingsResponse> {\n const { query, requestOptions } = resolvePaginatedArgs(optsOrQuery, legacyOpts);\n\n return this.http.request({\n endpoint: \"rankings.getBrawlers\",\n method: \"GET\",\n path: `/rankings/${encodeURIComponent(countryCode)}/brawlers/${encodeURIComponent(String(brawlerId))}`,\n query: normalizeCursorPaginationQuery(query),\n options: requestOptions,\n parser: endpointParsers[\"rankings.getBrawlers\"],\n });\n }\n}\n","import { HttpClient } from \"../internal/http-client.js\";\nimport { BrawlersResource } from \"../resources/brawlers-resource.js\";\nimport { ClubsResource } from \"../resources/clubs-resource.js\";\nimport { EventsResource } from \"../resources/events-resource.js\";\nimport { GameModesResource } from \"../resources/gamemodes-resource.js\";\nimport { PlayersResource } from \"../resources/players-resource.js\";\nimport { RankingsResource } from \"../resources/rankings-resource.js\";\nimport type { BrawlStarsClientOptions } from \"../types/client.js\";\nimport type { EndpointName } from \"../types/client.js\";\n\n/**\n * Main Brawl Stars API client.\n */\nexport class BrawlStarsClient {\n private readonly http: HttpClient;\n\n /**\n * Player operations.\n */\n public readonly players: PlayersResource;\n\n /**\n * Club operations.\n */\n public readonly clubs: ClubsResource;\n\n /**\n * Ranking operations.\n */\n public readonly rankings: RankingsResource;\n\n /**\n * Brawler operations.\n */\n public readonly brawlers: BrawlersResource;\n\n /**\n * Game mode operations.\n */\n public readonly gamemodes: GameModesResource;\n\n /**\n * Event operations.\n */\n public readonly events: EventsResource;\n\n /**\n * Create a new API client.\n */\n public constructor(options: BrawlStarsClientOptions) {\n this.http = new HttpClient(options);\n\n this.players = new PlayersResource(this.http);\n this.clubs = new ClubsResource(this.http);\n this.rankings = new RankingsResource(this.http);\n this.brawlers = new BrawlersResource(this.http);\n this.gamemodes = new GameModesResource(this.http);\n this.events = new EventsResource(this.http);\n }\n\n /**\n * Clear all in-memory cached responses.\n */\n public clearCache(): void {\n this.http.clearCache();\n }\n\n /**\n * Invalidate cache entries for one endpoint or all endpoints.\n */\n public invalidateCache(endpoint?: EndpointName): number {\n return this.http.invalidateCache(endpoint);\n }\n}\n","import { BrawlStarsClient } from \"./brawl-stars-client.js\";\nimport type { BrawlStarsClientOptions } from \"../types/client.js\";\n\n/**\n * Convenience factory for creating a `BrawlStarsClient`.\n */\nexport function createBrawlStarsClient(options: BrawlStarsClientOptions): BrawlStarsClient {\n return new BrawlStarsClient(options);\n}\n","import type {\n RequestEndEvent,\n RequestErrorEvent,\n RequestStartEvent,\n MetricsAdapter,\n} from \"../types/observability.js\";\n\ninterface CounterLike {\n inc(labels?: Record<string, string | number>, value?: number): void;\n}\n\ninterface HistogramLike {\n observe(labels: Record<string, string | number>, value: number): void;\n}\n\n/**\n * Minimal prom-client compatible adapter contract.\n */\nexport interface PromClientAdapterOptions {\n requestsStarted?: CounterLike;\n requestsCompleted?: CounterLike;\n requestsFailed?: CounterLike;\n requestDurationMs?: HistogramLike;\n}\n\n/**\n * Create a metrics adapter for projects already using `prom-client`.\n */\nexport function createPromClientAdapter(options: PromClientAdapterOptions): MetricsAdapter {\n return {\n onRequestStart(event: RequestStartEvent): void {\n options.requestsStarted?.inc({\n endpoint: event.endpoint,\n method: event.method,\n });\n },\n onRequestEnd(event: RequestEndEvent): void {\n options.requestsCompleted?.inc({\n endpoint: event.endpoint,\n method: event.method,\n statusCode: event.statusCode,\n });\n options.requestDurationMs?.observe(\n {\n endpoint: event.endpoint,\n method: event.method,\n statusCode: event.statusCode,\n },\n event.durationMs,\n );\n },\n onRequestError(event: RequestErrorEvent): void {\n options.requestsFailed?.inc({\n endpoint: event.endpoint,\n method: event.method,\n errorName: event.error.name,\n });\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACoDO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,UAA4B;AAC9D,UAAM,SAAS,SAAS,QAAQ,EAAE,OAAO,SAAS,MAAM,IAAI,MAAS;AAErE,SAAK,OAAO;AACZ,SAAK,WAAW,SAAS;AACzB,SAAK,SAAS,SAAS;AACvB,SAAK,UAAU,SAAS;AACxB,SAAK,aAAa,SAAS;AAC3B,SAAK,UAAU,SAAS,WAAW,CAAC;AACpC,SAAK,OAAO,SAAS,QAAQ,SAAS,gBAAgB,SAAS;AAC/D,SAAK,eAAe,KAAK;AACzB,SAAK,aACH,SAAS,eACL,SAAS,iBAAiB,SAAY,KAAK,IAAI,GAAG,KAAK,KAAK,SAAS,eAAe,GAAI,CAAC,IAAI;AACnG,SAAK,eACH,SAAS,iBACL,KAAK,eAAe,OAAO,KAAK,aAAa,MAAO;AAC1D,SAAK,YAAY,SAAS;AAAA,EAC5B;AACF;AAKO,IAAM,cAAN,cAA0B,SAAS;AAAA,EACjC,YAAY,SAAiB,UAA4B;AAC9D,UAAM,SAAS,QAAQ;AACvB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,iBAAN,cAA6B,SAAS;AAAA,EACpC,YAAY,SAAiB,UAA4B;AAC9D,UAAM,SAAS,QAAQ;AACvB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,eAAN,cAA2B,SAAS;AAAA,EAClC,YAAY,SAAiB,UAA4B;AAC9D,UAAM,SAAS,QAAQ;AACvB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,eAAN,cAA2B,SAAS;AAAA,EAClC,YAAY,SAAiB,UAA4B;AAC9D,UAAM,SAAS,QAAQ;AACvB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,kBAAN,cAA8B,SAAS;AAAA,EACrC,YAAY,SAAiB,UAA4B;AAC9D,UAAM,SAAS,QAAQ;AACvB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,0BAAN,cAAsC,gBAAgB;AAAA,EAC3C;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,UAAsC;AACxE,UAAM,SAAS,QAAQ;AACvB,SAAK,OAAO;AACZ,SAAK,iBAAiB,SAAS;AAC/B,SAAK,gBAAgB,SAAS;AAAA,EAChC;AACF;;;ACtIA,SAAS,QACP,OACkB;AAClB,MAAI,UAAU,QAAW;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,KAAU;AACpB;AAKO,IAAM,0BAAN,MAA8B;AAAA,EAClB;AAAA,EACA;AAAA,EAEV,YACL,WACA,SACA;AACA,SAAK,YAAY;AAAA,MACf,cAAc,QAAQ,WAAW,YAAY;AAAA,MAC7C,YAAY,QAAQ,WAAW,UAAU;AAAA,MACzC,cAAc,QAAQ,WAAW,YAAY;AAAA,IAC/C;AACA,SAAK,UAAU,QAAQ,OAAO;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,iBAAiB,OAAyC;AACrE,eAAW,YAAY,KAAK,UAAU,cAAc;AAClD,YAAM,SAAS,KAAK;AAAA,IACtB;AAEA,eAAW,WAAW,KAAK,SAAS;AAClC,cAAQ,iBAAiB,KAAK;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,eAAe,OAAuC;AACjE,eAAW,YAAY,KAAK,UAAU,YAAY;AAChD,YAAM,SAAS,KAAK;AAAA,IACtB;AAEA,eAAW,WAAW,KAAK,SAAS;AAClC,cAAQ,eAAe,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,iBAAiB,OAAyC;AACrE,eAAW,YAAY,KAAK,UAAU,cAAc;AAClD,YAAM,SAAS,KAAK;AAAA,IACtB;AAEA,eAAW,WAAW,KAAK,SAAS;AAClC,cAAQ,iBAAiB,KAAK;AAAA,IAChC;AAAA,EACF;AACF;;;AClFO,SAAS,oBACd,WACA,gBAKA;AACA,QAAM,aAAa,IAAI,gBAAgB;AACvC,MAAI;AACJ,MAAI,aAAa;AAEjB,QAAM,kBAAkB,MAAM;AAC5B,eAAW,MAAM,gBAAgB,MAAM;AAAA,EACzC;AAEA,MAAI,gBAAgB;AAClB,QAAI,eAAe,SAAS;AAC1B,iBAAW,MAAM,eAAe,MAAM;AAAA,IACxC,OAAO;AACL,qBAAe,iBAAiB,SAAS,iBAAiB,EAAE,MAAM,KAAK,CAAC;AAAA,IAC1E;AAAA,EACF;AAEA,MAAI,YAAY,GAAG;AACjB,gBAAY,WAAW,MAAM;AAC3B,mBAAa;AACb,iBAAW,MAAM,IAAI,MAAM,mBAAmB,CAAC;AAAA,IACjD,GAAG,SAAS;AAAA,EACd;AAEA,SAAO;AAAA,IACL,QAAQ,WAAW;AAAA,IACnB,SAAS,MAAM;AACb,UAAI,WAAW;AACb,qBAAa,SAAS;AAAA,MACxB;AACA,sBAAgB,oBAAoB,SAAS,eAAe;AAAA,IAC9D;AAAA,IACA,UAAU,MAAM;AAAA,EAClB;AACF;;;AC5BO,IAAM,iCAAwD,CAAC,iBAAiB;AAEvF,SAAS,oBAAoB,MAAsB;AACjD,SAAO,KAAK,YAAY,EAAE,KAAK;AACjC;AAEA,SAAS,mBAAmB,OAAgB,MAA4B;AACtE,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO;AACzB,MAAI,cAAc,UAAU;AAC1B,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AACA,MAAI,cAAc,YAAY,cAAc,WAAW;AACrD,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,MAAI,cAAc,aAAa;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,cAAc,UAAU;AAC1B,WAAO,GAAG,OAAO,KAAK,CAAC;AAAA,EACzB;AACA,MAAI,iBAAiB,MAAM;AACzB,WAAO,QAAQ,MAAM,YAAY,CAAC;AAAA,EACpC;AACA,MAAI,iBAAiB,iBAAiB;AACpC,UAAM,SAAS,CAAC,GAAG,MAAM,QAAQ,CAAC,EAC/B,KAAK,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,UAAU,UAAU,MAAM;AACtD,UAAI,YAAY,UAAU;AACxB,eAAO,UAAU,cAAc,UAAU;AAAA,MAC3C;AAEA,aAAO,QAAQ,cAAc,QAAQ;AAAA,IACvC,CAAC,EACA,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM,GAAG,mBAAmB,GAAG,CAAC,IAAI,mBAAmB,UAAU,CAAC,EAAE,EACzF,KAAK,GAAG;AACX,WAAO,UAAU,MAAM;AAAA,EACzB;AACA,MAAI,iBAAiB,aAAa;AAChC,WAAO,UAAU,MAAM,KAAK,IAAI,WAAW,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,EAC9D;AACA,MAAI,YAAY,OAAO,KAAK,GAAG;AAC7B,UAAM,OAAO,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC5E,WAAO,QAAQ,MAAM,KAAK,IAAI,EAAE,KAAK,GAAG,CAAC;AAAA,EAC3C;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,KAAK;AACd,UAAM,aAAa,IAAI,MAAM,IAAI,CAAC,UAAU,mBAAmB,OAAO,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC;AACtF,SAAK,OAAO,KAAK;AACjB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,KAAK;AACd,UAAM,SAAS;AACf,UAAM,aAAa,IAAI,OAAO,KAAK,MAAM,EACtC,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAC/C,IAAI,CAAC,QAAQ,GAAG,KAAK,UAAU,GAAG,CAAC,IAAI,mBAAmB,OAAO,GAAG,GAAG,IAAI,CAAC,EAAE,EAC9E,KAAK,GAAG,CAAC;AACZ,SAAK,OAAO,KAAK;AACjB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,UAAU,OAAO,KAAK,CAAC;AACrC;AAEA,SAAS,WAAW,OAAuB;AACzC,MAAI,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,YAAQ,MAAM,WAAW,KAAK;AAC9B,WAAO,KAAK,KAAK,MAAM,QAAU;AAAA,EACnC;AAEA,UAAQ,SAAS,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAClD;AAKO,SAAS,eACd,SACA,mBAA0C,gCAClC;AACR,QAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,QAAM,SAAS,OAAO,QAAQ,MAAM,EAAE,YAAY;AAClD,QAAM,QAAQ,CAAC,GAAG,IAAI,aAAa,QAAQ,CAAC,EACzC,KAAK,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,UAAU,UAAU,MAAM;AACtD,QAAI,YAAY,UAAU;AACxB,aAAO,UAAU,cAAc,UAAU;AAAA,IAC3C;AAEA,WAAO,QAAQ,cAAc,QAAQ;AAAA,EACvC,CAAC,EACA,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,mBAAmB,GAAG,CAAC,IAAI,mBAAmB,KAAK,CAAC,EAAE,EAC/E,KAAK,GAAG;AAEX,QAAM,UAAU,IAAI,IAAI,iBAAiB,IAAI,CAAC,WAAW,oBAAoB,MAAM,CAAC,CAAC;AACrF,QAAM,iBAAiB,IAAI,QAAQ,QAAQ,WAAW,CAAC,CAAC;AACxD,QAAM,kBAAkB,CAAC,GAAG,eAAe,QAAQ,CAAC,EACjD,OAAO,CAAC,CAAC,IAAI,MAAM,QAAQ,IAAI,oBAAoB,IAAI,CAAC,CAAC,EACzD,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,oBAAoB,IAAI,CAAC,IAAI,KAAK,EAAE,EAC9D,KAAK,GAAG;AAEX,QAAM,iBACJ,QAAQ,SAAS,SAAY,KAAK,mBAAmB,QAAQ,MAAM,oBAAI,IAAa,CAAC;AACvF,QAAM,WAAW,WAAW,cAAc;AAE1C,SAAO,GAAG,MAAM,IAAI,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,eAAe;AAC1E;;;ACnIO,SAAS,aAAa,gBAA6B,UAAiC;AACzF,QAAM,UAAU,IAAI,QAAQ,cAAc;AAE1C,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,IAAI,QAAQ,QAAQ;AAC5C,kBAAgB,QAAQ,CAAC,OAAO,QAAQ;AACtC,YAAQ,IAAI,KAAK,KAAK;AAAA,EACxB,CAAC;AAED,SAAO;AACT;AAKO,SAAS,mBAAmB,SAA0C;AAC3E,QAAM,UAAkC,CAAC;AAEzC,UAAQ,QAAQ,CAAC,OAAO,QAAQ;AAC9B,UAAM,gBAAgB,IAAI,YAAY;AACtC,QAAI,kBAAkB,iBAAiB;AACrC,cAAQ,GAAG,IAAI;AACf;AAAA,IACF;AAEA,YAAQ,GAAG,IAAI;AAAA,EACjB,CAAC;AAED,SAAO;AACT;;;AChBA,SAAS,QACP,MACiC;AACjC,MAAI,SAAS,QAAW;AACtB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,IAAwB;AAClC;AAKO,SAAS,eAAe,OAAsC;AACnE,SAAO;AAAA,IACL,eAAe,QAAQ,OAAO,aAAa;AAAA,IAC3C,eAAe,QAAQ,OAAO,aAAa;AAAA,IAC3C,SAAS,QAAQ,OAAO,OAAO;AAAA,IAC/B,aAAa,QAAQ,OAAO,WAAW;AAAA,EACzC;AACF;AAKO,SAAS,WAAW,aAA8B,cAA6C;AACpG,QAAM,aAAa,eAAe,YAAY;AAE9C,SAAO;AAAA,IACL,eAAe,CAAC,GAAG,YAAY,eAAe,GAAG,WAAW,aAAa;AAAA,IACzE,eAAe,CAAC,GAAG,YAAY,eAAe,GAAG,WAAW,aAAa;AAAA,IACzE,SAAS,CAAC,GAAG,YAAY,SAAS,GAAG,WAAW,OAAO;AAAA,IACvD,aAAa,CAAC,GAAG,YAAY,aAAa,GAAG,WAAW,WAAW;AAAA,EACrE;AACF;;;ACjDO,IAAM,cAAN,MAAgC;AAAA,EAG9B,YAA6B,SAAiB;AAAjB;AAClC,QAAI,CAAC,OAAO,UAAU,OAAO,KAAK,WAAW,GAAG;AAC9C,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAAA,EACF;AAAA,EANiB,UAAU,oBAAI,IAA8B;AAAA;AAAA;AAAA;AAAA,EAWtD,IAAI,KAAW,QAAgB,KAAK,IAAI,GAAuB;AACpE,UAAM,QAAQ,KAAK,QAAQ,IAAI,GAAG;AAClC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,aAAa,OAAO;AAC5B,WAAK,QAAQ,OAAO,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,SAAK,QAAQ,OAAO,GAAG;AACvB,SAAK,QAAQ,IAAI,KAAK,KAAK;AAE3B,WAAO,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKO,IAAI,KAAW,OAAe,OAAe,QAAgB,KAAK,IAAI,GAAS;AACpF,QAAI,SAAS,GAAG;AACd;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,IAAI,GAAG,GAAG;AACzB,WAAK,QAAQ,OAAO,GAAG;AAAA,IACzB;AAEA,SAAK,QAAQ,IAAI,KAAK;AAAA,MACpB;AAAA,MACA,WAAW,QAAQ;AAAA,IACrB,CAAC;AAED,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKO,OAAO,KAAoB;AAChC,WAAO,KAAK,QAAQ,OAAO,GAAG;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKO,YAAY,WAA0D;AAC3E,QAAI,UAAU;AAEd,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,QAAQ,QAAQ,GAAG;AACjD,UAAI,UAAU,KAAK,MAAM,KAAK,GAAG;AAC/B,aAAK,QAAQ,OAAO,GAAG;AACvB,mBAAW;AAAA,MACb;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,OAAe;AACpB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AACnB,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEQ,gBAAsB;AAC5B,WAAO,KAAK,QAAQ,OAAO,KAAK,SAAS;AACvC,YAAM,iBAAiB,KAAK,QAAQ,KAAK,EAAE,KAAK;AAChD,UAAI,eAAe,MAAM;AACvB;AAAA,MACF;AAEA,WAAK,QAAQ,OAAO,eAAe,KAAK;AAAA,IAC1C;AAAA,EACF;AACF;;;ACnGA,IAAM,sBAAsB,CAAC,aAAa;AAC1C,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAASA,qBAAoB,MAAsB;AACjD,SAAO,KAAK,YAAY,EAAE,QAAQ,eAAe,EAAE;AACrD;AAEA,SAAS,eAAe,SAAkB,YAAkD;AAC1F,aAAW,aAAa,YAAY;AAClC,UAAM,QAAQ,QAAQ,IAAI,SAAS;AACnC,QAAI,UAAU,MAAM;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,iBAAiB,IAAI,IAAI,WAAW,IAAI,CAAC,cAAcA,qBAAoB,SAAS,CAAC,CAAC;AAC5F,aAAW,CAAC,MAAM,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAC7C,QAAI,eAAe,IAAIA,qBAAoB,IAAI,CAAC,GAAG;AACjD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,uBACd,kBACA,QAAgB,KAAK,IAAI,GACV;AACf,MAAI,CAAC,kBAAkB;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,iBAAiB,KAAK;AACzC,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,OAAO,UAAU;AACxC,MAAI,OAAO,SAAS,cAAc,GAAG;AACnC,WAAO,KAAK,IAAI,GAAG,KAAK,KAAK,cAAc,CAAC;AAAA,EAC9C;AAEA,QAAM,YAAY,KAAK,MAAM,UAAU;AACvC,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,SAAS,GAAI,CAAC;AAC1D;AAKO,SAAS,kBACd,kBACA,QAAgB,KAAK,IAAI,GACL;AACpB,QAAM,oBAAoB,uBAAuB,kBAAkB,KAAK;AACxE,MAAI,sBAAsB,MAAM;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,oBAAoB;AAC7B;AAKO,SAAS,sBACd,aACA,QAAgB,KAAK,IAAI,GACL;AACpB,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,YAAY,KAAK,CAAC;AACzC,MAAI,CAAC,OAAO,SAAS,OAAO,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,MAAmB;AAC/B,WAAO,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,KAAK,CAAC;AAAA,EAChD;AAEA,MAAI,UAAU,KAAe;AAC3B,WAAO,KAAK,IAAI,GAAG,KAAK,MAAO,UAAU,MAAQ,KAAK,CAAC;AAAA,EACzD;AAEA,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,GAAI,CAAC;AAC/C;AAKO,SAAS,sBACd,SACA,QAAgB,KAAK,IAAI,GACL;AACpB,QAAM,eAAe,kBAAkB,eAAe,SAAS,mBAAmB,GAAG,KAAK;AAC1F,QAAM,eAAe,sBAAsB,eAAe,SAAS,mBAAmB,GAAG,KAAK;AAC9F,QAAM,UAAU,sBAAsB,eAAe,SAAS,aAAa,GAAG,KAAK;AAEnF,QAAM,SAAS,CAAC,cAAc,cAAc,OAAO,EAAE;AAAA,IACnD,CAAC,UAA2B,UAAU;AAAA,EACxC;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,GAAG,MAAM;AAC3B;AAKO,SAAS,yBACd,SACA,QAAgB,KAAK,IAAI,GACV;AACf,SAAO,uBAAuB,eAAe,SAAS,mBAAmB,GAAG,KAAK;AACnF;AAKO,SAAS,qBAAqB,SAA2B;AAC9D,QAAM,YAAY,eAAe,SAAS,iBAAiB;AAC3D,MAAI,cAAc,MAAM;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,SAAS;AAChC,MAAI,CAAC,OAAO,SAAS,OAAO,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,WAAW;AACpB;AAKO,SAAS,oBAAoB,SAAkC;AACpE,QAAM,QAAQ,eAAe,SAAS,aAAa,GAAG,YAAY,KAAK;AACvE,MAAI,MAAM,SAAS,QAAQ,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC9KO,IAAM,wBAAsC;AAAA,EACjD,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,sBAAsB,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG;AAChD;AAKO,SAAS,oBAAoB,OAAsD;AACxF,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,eAAe,sBAAsB,WAAW,CAAC;AAAA,IAC3F,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,eAAe,sBAAsB,WAAW,CAAC;AAAA,IAC3F,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,cAAc,sBAAsB,UAAU,CAAC;AAAA,IACxF,eAAe,KAAK,IAAI,GAAG,MAAM,iBAAiB,sBAAsB,aAAa;AAAA,IACrF,QAAQ,MAAM,UAAU,sBAAsB;AAAA,IAC9C,sBACE,MAAM,wBAAwB,sBAAsB;AAAA,EACxD;AACF;AAKO,SAAS,kBAAkB,YAAoB,SAAgC;AACpF,SAAO,QAAQ,qBAAqB,SAAS,UAAU;AACzD;AAKO,SAAS,oBACd,aACA,SACA,aACA,gBACQ;AACR,QAAM,WAAW,KAAK,IAAI,GAAG,cAAc,CAAC;AAC5C,QAAM,cAAc,KAAK;AAAA,IACvB,QAAQ,cAAc,QAAQ,iBAAiB;AAAA,IAC/C,QAAQ;AAAA,EACV;AAEA,QAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,WAAW,CAAC;AAC1D,QAAM,QACJ,QAAQ,WAAW,SACf,KAAK,MAAM,gBAAgB,WAAW,IACtC,KAAK,MAAM,WAAW;AAE5B,MAAI,mBAAmB,QAAW;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,OAAO,cAAc;AACvC;;;ACtEO,IAAM,YAAN,MAAgB;AAAA,EAId,YAA6B,UAAkB;AAAlB;AAClC,QAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,YAAY,GAAG;AAChD,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAAA,EACF;AAAA,EAPiB,QAA2B,CAAC;AAAA,EACrC,QAAQ;AAAA;AAAA;AAAA;AAAA,EAWhB,MAAa,UAA+B;AAC1C,QAAI,KAAK,QAAQ,KAAK,UAAU;AAC9B,WAAK,SAAS;AACd,aAAO,MAAM;AACX,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAEA,UAAM,IAAI,QAAc,CAAC,YAAY;AACnC,WAAK,MAAM,KAAK,OAAO;AAAA,IACzB,CAAC;AAED,SAAK,SAAS;AAEd,WAAO,MAAM;AACX,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,UAAgB;AACtB,SAAK,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ,CAAC;AAEvC,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,QAAI,MAAM;AACR,WAAK;AAAA,IACP;AAAA,EACF;AACF;;;ACxCO,SAAS,MAAM,SAAgC;AACpD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,OAAO;AAAA,EAC7B,CAAC;AACH;;;ACJO,SAAS,SACd,SACA,SACA,OACQ;AACR,QAAM,OAAO,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AAC5D,QAAM,OAAO,QAAQ,WAAW,GAAG,IAAI,UAAU,IAAI,OAAO;AAC5D,QAAM,MAAM,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE;AAEpC,MAAI,CAAC,OAAO;AACV,WAAO,IAAI,SAAS;AAAA,EACtB;AAEA,QAAM,eAAe,OAAO,QAAQ,KAAK,EACtC,OAAO,CAAC,UAAwD,MAAM,CAAC,MAAM,MAAS,EACtF,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC;AAEtD,aAAW,CAAC,KAAK,KAAK,KAAK,cAAc;AACvC,QAAI,UAAU,QAAW;AACvB;AAAA,IACF;AAEA,QAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,EACzC;AAEA,SAAO,IAAI,SAAS;AACtB;;;ACgCA,IAAM,qBAAqB;AAC3B,IAAM,4BAA4B;AAK3B,IAAM,aAAN,MAAiB;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,yBAAyB;AAAA,EAChB,wBAAwB,oBAAI,IAAoB;AAAA,EAChD,qBAAqB,oBAAI,IAA+B;AAAA,EACjE,iBAAiB;AAAA,EAElB,YAAY,SAAkC;AACnD,UAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAEA,SAAK,UAAU,QAAQ,SAAS,WAAW;AAC3C,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AAEA,SAAK,WAAW,QAAQ,WAAW,iCAAiC,QAAQ,SAAS,EAAE;AACvF,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,eAAe,oBAAoB,QAAQ,OAAO;AACvD,SAAK,iBAAiB,KAAK,sBAAsB,QAAQ,YAAY,QAAQ,iBAAiB;AAC9F,SAAK,SAAS,QAAQ,UAAU;AAChC,SAAK,iBAAiB,IAAI,QAAQ;AAAA,MAChC,eAAe,UAAU,KAAK;AAAA,MAC9B,QAAQ;AAAA,IACV,CAAC;AACD,SAAK,QAAQ,eAAe,QAAQ,KAAK;AACzC,SAAK,gBAAgB,IAAI;AAAA,MACvB,QAAQ,eAAe;AAAA,MACvB,QAAQ,eAAe;AAAA,IACzB;AAEA,SAAK,gBAAgB,KAAK,qBAAqB,QAAQ,KAAK;AAC5D,SAAK,kBAAkB,QAAQ,mBAAmB;AAClD,SAAK,QAAQ,KAAK,cAAc,UAC5B,IAAI,YAA6B,KAAK,cAAc,OAAO,IAC3D;AAEJ,UAAM,cAAc,QAAQ,oBAAoB;AAChD,SAAK,YAAY,IAAI,UAAU,WAAW;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,QAAmB,QAA8D;AAC5F,WAAO,KAAK,eAAe,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKO,aAAmB;AACxB,SAAK,OAAO,MAAM;AAClB,SAAK,mBAAmB,MAAM;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKO,gBAAgB,UAAiC;AACtD,QAAI,CAAC,KAAK,OAAO;AACf,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,UAAU;AACb,YAAM,aAAa,KAAK,MAAM,KAAK;AACnC,WAAK,MAAM,MAAM;AACjB,WAAK,mBAAmB,MAAM;AAC9B,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,KAAK,mBAAmB,IAAI,QAAQ;AACjD,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI,UAAU;AACd,eAAW,OAAO,MAAM;AACtB,UAAI,KAAK,MAAM,OAAO,GAAG,GAAG;AAC1B,mBAAW;AAAA,MACb;AAAA,IACF;AACA,SAAK,mBAAmB,OAAO,QAAQ;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eACZ,QACoB;AACpB,UAAM,eAAe,oBAAoB,OAAO,SAAS,WAAW,KAAK,YAAY;AACrF,UAAM,YAAY,OAAO,SAAS,aAAa,KAAK;AACpD,UAAM,iBAAiB,KAAK;AAAA,MAC1B,OAAO,SAAS;AAAA,MAChB,OAAO,SAAS;AAAA,MAChB,KAAK;AAAA,IACP;AACA,UAAM,QAAQ,WAAW,KAAK,OAAO,OAAO,SAAS,KAAK;AAE1D,UAAM,MAAM,SAAS,KAAK,SAAS,OAAO,MAAM,OAAO,KAAK;AAC5D,UAAM,UAAU,aAAa,KAAK,gBAAgB,OAAO,SAAS,OAAO;AACzE,UAAM,qBAAqB,mBAAmB,OAAO;AACrD,UAAM,kBAAkB,KAAK,sBAAsB,OAAO,QAAQ,KAAK,OAAO,SAAS,kBAAkB;AAEzG,UAAM,YAAY,KAAK,gBAAgB;AACvC,UAAM,WAAW,OAAO;AACxB,UAAM,cAAc,KAAK,mBAAmB,OAAO,UAAU,OAAO,SAAS,KAAK;AAClF,UAAM,WAAW,eAAe;AAAA,MAC9B,QAAQ,OAAO;AAAA,MACf;AAAA,MACA;AAAA,IACF,GAAG,KAAK,eAAe;AACvB,UAAM,cAAc,YAAY,WAAW,KAAK,SAAS,KAAK,kBAAkB,OAAO,MAAM;AAE7F,QAAI,aAAa;AACf,YAAM,SAAS,KAAK,MAAM,IAAI,QAAQ;AACtC,UAAI,WAAW,QAAW;AACxB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,aAAS,UAAU,GAAG,WAAW,aAAa,aAAa,WAAW,GAAG;AACvE,YAAM,KAAK,uBAAuB,QAAQ;AAC1C,YAAM,UAAU,MAAM,KAAK,UAAU,QAAQ;AAE7C,YAAM,YAAY,KAAK,IAAI;AAC3B,YAAM,EAAE,QAAQ,SAAS,SAAS,IAAI,oBAAoB,WAAW,OAAO,SAAS,MAAM;AAC3F,UAAI,sBAAsB;AAE1B,UAAI;AACF,cAAM,KAAK,cAAc,iBAAiB;AAAA,UACxC;AAAA,UACA,UAAU,OAAO;AAAA,UACjB,QAAQ,OAAO;AAAA,UACf;AAAA,UACA;AAAA,QACF,CAAC;AAED,mBAAW,QAAQ,MAAM,eAAe;AACtC,gBAAM,KAAK;AAAA,YACT,UAAU,OAAO;AAAA,YACjB,QAAQ,OAAO;AAAA,YACf;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,cAAM,WAAW,MAAM,KAAK,QAAQ,KAAK;AAAA,UACvC,QAAQ,OAAO;AAAA,UACf;AAAA,UACA;AAAA,QACF,CAAC;AAED,cAAM,aAAa,KAAK,IAAI,IAAI;AAChC,cAAM,sBAAsB,mBAAmB,SAAS,OAAO;AAE/D,cAAM,KAAK,cAAc,eAAe;AAAA,UACtC;AAAA,UACA,UAAU,OAAO;AAAA,UACjB,QAAQ,OAAO;AAAA,UACf;AAAA,UACA;AAAA,UACA,YAAY,SAAS;AAAA,UACrB;AAAA,QACF,CAAC;AAED,mBAAW,QAAQ,MAAM,eAAe;AACtC,gBAAM,KAAK;AAAA,YACT,UAAU,OAAO;AAAA,YACjB,QAAQ,OAAO;AAAA,YACf;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,SAAS;AAAA,YACrB,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,aAAK,qBAAqB,SAAS,SAAS,SAAS,QAAQ,QAAQ;AAErE,YAAI,SAAS,IAAI;AACf,gBAAM,UAAU,MAAM,KAAK,kBAAkB,QAAQ;AAErD,gBAAM,iBAAiB,mBAAmB,YAAY,mBAAmB;AACzE,cAAI;AACJ,cAAI;AACF,qBAAS,OAAO,OAAO,SAAS,cAAc;AAAA,UAChD,SAASC,QAAO;AACd,gBAAI,mBAAmB,OAAO;AAC5B,uBAAS;AAAA,YACX,WAAW,mBAAmB,QAAQ;AACpC,mBAAK,OAAO;AAAA,gBACV,oDAAoD,OAAO,QAAQ,MAAOA,OAAgB,OAAO;AAAA,cACnG;AACA,uBAAS;AAAA,YACX,OAAO;AACL,oBAAM,IAAI,wBAAwB,sCAAsC;AAAA,gBACtE,UAAU,OAAO;AAAA,gBACjB,QAAQ,OAAO;AAAA,gBACf,YAAY,SAAS;AAAA,gBACrB,SAAS;AAAA,gBACT,SAAS;AAAA,gBACT,gBAAgB,OAAO;AAAA,gBACvB,eAAe;AAAA,gBACf,UAAU;AAAA,gBACV;AAAA,gBACA,OAAOA;AAAA,cACT,CAAC;AAAA,YACH;AAAA,UACF;AAEA,cAAI,aAAa;AACf,iBAAK,MAAM,IAAI,UAAU,QAAQ,YAAY,KAAK;AAClD,iBAAK,sBAAsB,OAAO,UAAU,QAAQ;AAAA,UACtD;AAEA,kBAAQ;AACR,iBAAO;AAAA,QACT;AAEA,cAAM,YAAY,MAAM,KAAK,kBAAkB,QAAQ;AACvD,cAAM,aAAa,yBAAyB,SAAS,OAAO;AAC5D,cAAM,kBAAkB,SAAS,QAAQ,IAAI,cAAc,KAAK;AAChE,cAAM,WACJ,UAAU,aAAa,eAAe,kBAAkB,SAAS,QAAQ,YAAY;AAEvF,cAAM,QAAQ,KAAK;AAAA,UACjB,OAAO;AAAA,UACP,OAAO;AAAA,UACP;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,YAAI,SAAS,WAAW,KAAK;AAC3B,qBAAW,QAAQ,MAAM,aAAa;AACpC,kBAAM,KAAK;AAAA,cACT,UAAU,OAAO;AAAA,cACjB,QAAQ,OAAO;AAAA,cACf;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY,SAAS;AAAA,cACrB;AAAA,cACA,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,KAAK,UAAU,OAAO;AAAA,UAC1B,UAAU,OAAO;AAAA,UACjB,QAAQ,OAAO;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX;AAAA,QACF,CAAC;AACD,8BAAsB;AAEtB,gBAAQ;AAER,YAAI,CAAC,UAAU;AACb,gBAAM;AAAA,QACR;AAEA,cAAM,mBAAmB,sBAAsB,SAAS,OAAO;AAC/D,cAAM,eAAe;AAAA,UACnB;AAAA,UACA;AAAA,UACA,KAAK,OAAO;AAAA,UACZ;AAAA,QACF;AAEA,YAAI,eAAe,GAAG;AACpB,gBAAM,MAAM,YAAY;AAAA,QAC1B;AAEA;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ;AAER,YAAI,iBAAiB,UAAU;AAC7B,cAAI,CAAC,qBAAqB;AACxB,kBAAM,KAAK,UAAU,OAAO;AAAA,cAC1B,UAAU,OAAO;AAAA,cACjB,QAAQ,OAAO;AAAA,cACf;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY,KAAK,IAAI,IAAI;AAAA,cACzB,WAAW;AAAA,cACX;AAAA,YACF,CAAC;AAAA,UACH;AAEA,gBAAM;AAAA,QACR;AAEA,cAAM,aAAa,KAAK,IAAI,IAAI;AAChC,cAAM,uBAAuB,QAAQ,OAAO,SAAS,QAAQ,OAAO,KAAK,CAAC,SAAS;AACnF,cAAM,WAAW,UAAU,aAAa,eAAe,CAAC;AAExD,cAAM,eAAe,SAAS,IAC1B,IAAI,aAAa,sBAAsB;AAAA,UACrC,UAAU,OAAO;AAAA,UACjB,QAAQ,OAAO;AAAA,UACf,SAAS;AAAA,UACT,SAAS,CAAC;AAAA,UACV,YAAY;AAAA,UACZ;AAAA,UACA,OAAO;AAAA,QACT,CAAC,IACD,IAAI;AAAA,UACJ,uBAAuB,mCAAmC;AAAA,UAC1D;AAAA,YACE,UAAU,OAAO;AAAA,YACjB,QAAQ,OAAO;AAAA,YACf,SAAS;AAAA,YACT,SAAS,CAAC;AAAA,YACV,YAAY;AAAA,YACZ;AAAA,YACA,OAAO;AAAA,UACT;AAAA,QACF;AAEF,cAAM,KAAK,UAAU,OAAO;AAAA,UAC1B,UAAU,OAAO;AAAA,UACjB,QAAQ,OAAO;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,OAAO;AAAA,QACT,CAAC;AAED,YAAI,CAAC,UAAU;AACb,gBAAM;AAAA,QACR;AAEA,cAAM,eAAe,oBAAoB,SAAS,cAAc,KAAK,OAAO,CAAC;AAC7E,YAAI,eAAe,GAAG;AACpB,gBAAM,MAAM,YAAY;AAAA,QAC1B;AAAA,MACF,UAAE;AACA,gBAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,IAAI,SAAS,+BAA+B;AAAA,MAChD,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,SAAS;AAAA,MACT,SAAS,CAAC;AAAA,MACV,YAAY;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,kBAA0B;AAChC,SAAK,kBAAkB;AACvB,WAAO,GAAG,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,eAAe,SAAS,EAAE,CAAC;AAAA,EACvE;AAAA,EAEQ,eACN,UACA,QACA,KACA,SACA,oBACA,YACA,SACA,MACA,YACA,WACU;AACV,UAAM,UAAU,KAAK,sBAAsB,QAAQ,KAAK,SAAS,kBAAkB;AACnF,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,eAAe,KAAK;AACtB,aAAO,IAAI,eAAe,wBAAwB,QAAQ;AAAA,IAC5D;AAEA,QAAI,cAAc,OAAO,aAAa,KAAK;AACzC,aAAO,IAAI,YAAY,kCAAkC,UAAU,KAAK,QAAQ;AAAA,IAClF;AAEA,WAAO,IAAI,SAAS,kCAAkC,UAAU,KAAK,QAAQ;AAAA,EAC/E;AAAA,EAEA,MAAc,UACZ,OACA,SAUe;AACf,UAAM,KAAK,cAAc,iBAAiB;AAAA,MACxC,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,MAChB,KAAK,QAAQ;AAAA,MACb,SAAS,QAAQ;AAAA,MACjB,YAAY,QAAQ;AAAA,MACpB,WAAW,QAAQ;AAAA,MACnB,OAAO,QAAQ;AAAA,IACjB,CAAC;AAED,eAAW,QAAQ,MAAM,SAAS;AAChC,YAAM,KAAK,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,sBACN,MACA,wBACA,eAA+B,QACf;AAChB,QAAI,SAAS,QAAW;AACtB,aAAO;AAAA,IACT;AAEA,QAAI,2BAA2B,QAAW;AACxC,aAAO;AAAA,IACT;AAEA,WAAO,yBAAyB,WAAW;AAAA,EAC7C;AAAA,EAEQ,sBACN,QACA,KACA,SACA,aAWA;AACA,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,QAAQ,IAAI;AAAA,IACvB;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,WAAW,QAAQ;AAAA,QACnB,SAAS,QAAQ;AAAA,QACjB,OAAO,QAAQ;AAAA,QACf,YAAY,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,KAAK;AAAA,QACP;AAAA,QACA,SAAS,OAAO,KAAK,WAAW,EAAE,SAAS,IAAI,cAAc;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAqB,OAAkE;AAC7F,QAAI,UAAU,OAAO;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,QACP,eAAe,CAAC;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,aAAO;AAAA,QACL,SAAS,UAAU;AAAA,QACnB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,eAAe,CAAC;AAAA,MAClB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,MAAM,WAAW;AAAA,MAC1B,OAAO,MAAM,SAAS;AAAA,MACtB,eAAe,MAAM,iBAAiB,CAAC;AAAA,IACzC;AAAA,EACF;AAAA,EAEQ,mBACN,UACA,cACqB;AACrB,QAAI,CAAC,KAAK,cAAc,WAAW,KAAK,UAAU,MAAM;AACtD,aAAO,EAAE,SAAS,OAAO,OAAO,EAAE;AAAA,IACpC;AAEA,QAAI,iBAAiB,OAAO;AAC1B,aAAO,EAAE,SAAS,OAAO,OAAO,EAAE;AAAA,IACpC;AAEA,UAAM,gBAAgB,KAAK,cAAc,cAAc,QAAQ;AAC/D,UAAM,QACJ,OAAO,iBAAiB,YAAY,aAAa,UAAU,SACvD,aAAa,QACb,iBAAiB,KAAK,cAAc;AAE1C,UAAM,UACJ,iBAAiB,QACd,iBAAiB,UAChB,OAAO,iBAAiB,YAAY,aAAa,YAAY;AAEnE,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAkB,QAA6B;AACrD,WAAO,WAAW;AAAA,EACpB;AAAA,EAEQ,sBAAsB,UAAwB,UAAwB;AAC5E,UAAM,WAAW,KAAK,mBAAmB,IAAI,QAAQ;AACrD,QAAI,UAAU;AACZ,eAAS,IAAI,QAAQ;AACrB;AAAA,IACF;AAEA,SAAK,mBAAmB,IAAI,UAAU,oBAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAAA,EAC3D;AAAA,EAEA,MAAc,uBAAuB,UAAiC;AACpE,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,aAAa,KAAK,sBAAsB,IAAI,QAAQ,KAAK;AAC/D,UAAM,kBAAkB,KAAK,IAAI,KAAK,wBAAwB,UAAU;AAExE,QAAI,mBAAmB,KAAK;AAC1B;AAAA,IACF;AAEA,UAAM,MAAM,kBAAkB,GAAG;AAAA,EACnC;AAAA,EAEQ,qBAAqB,SAAkB,YAAoB,UAAwB;AACzF,UAAM,UAAU,sBAAsB,OAAO;AAC7C,QAAI,YAAY,QAAW;AACzB;AAAA,IACF;AAEA,UAAM,eAAe,eAAe,OAAO,qBAAqB,OAAO;AACvE,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,IAAI,IAAI;AACjC,UAAM,QAAQ,oBAAoB,OAAO;AAEzC,QAAI,UAAU,UAAU;AACtB,WAAK,yBAAyB,KAAK,IAAI,KAAK,wBAAwB,WAAW;AAC/E;AAAA,IACF;AAEA,UAAM,oBAAoB,KAAK,sBAAsB,IAAI,QAAQ,KAAK;AACtE,SAAK,sBAAsB,IAAI,UAAU,KAAK,IAAI,mBAAmB,WAAW,CAAC;AAAA,EACnF;AAAA,EAEA,MAAc,kBAAkB,UAAsC;AACpE,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,GAAG,YAAY,KAAK;AAE3E,QAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,UAAI;AACF,eAAQ,MAAM,SAAS,KAAK;AAAA,MAC9B,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC5rBO,SAAS,SAAS,OAAkD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAKO,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU;AAC1B;AAKO,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAC3D;AAKO,SAAS,UAAU,OAAkC;AAC1D,SAAO,OAAO,UAAU;AAC1B;AAKO,SAAS,YAAY,OAAiD;AAC3E,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,OAAO,KAAK,EAAE,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ;AACxE;AAKO,SAAS,UACd,OACA,OACc;AACd,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,UAAU,MAAM,KAAK,CAAC;AACpE;;;AC5CA,SAAS,SAAS,OAAiC;AACjD,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,YAAY,QAAW;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,MAAM,OAAO,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,QAAQ;AAC7B,QAAM,QAAQ,MAAM,QAAQ;AAE5B,UAAQ,WAAW,UAAa,SAAS,MAAM,OAAO,UAAU,UAAa,SAAS,KAAK;AAC7F;AAKO,SAAS,sBACd,SACA,WACwB;AACxB,MAAI,UAAU,SAAS,SAAS,GAAG;AACjC,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAEA,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,QAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,UAAU,OAAO,SAAS,GAAG;AAChC,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,QAAM,SAAS,QAAQ;AACvB,MAAI,WAAW,UAAa,CAAC,SAAS,MAAM,GAAG;AAC7C,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;ACzBA,SAAS,UAAU,QAAiC,KAAsB;AACxE,SAAO,SAAS,OAAO,GAAG,CAAC;AAC7B;AAEA,SAAS,UAAU,QAAiC,KAAsB;AACxE,SAAO,SAAS,OAAO,GAAG,CAAC;AAC7B;AAEA,SAAS,WAAW,QAAiC,KAAsB;AACzE,SAAO,UAAU,OAAO,GAAG,CAAC;AAC9B;AAKO,SAAS,oBAAoB,OAA4C;AAC9E,SAAO,YAAY,KAAK;AAC1B;AAKO,SAAS,aAAa,OAAqC;AAChE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,OAAO,IAAI;AAC9B;AAKO,SAAS,YAAY,OAAoC;AAC9D,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,OAAO,IAAI,KAAK,oBAAoB,MAAM,IAAI;AACjE;AAKO,SAAS,YAAY,OAAoC;AAC9D,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,OAAO,IAAI,KAAK,oBAAoB,MAAM,IAAI;AACjE;AAKO,SAAS,cAAc,OAAsC;AAClE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,OAAO,IAAI,KAAK,oBAAoB,MAAM,IAAI;AACjE;AAKO,SAAS,WAAW,OAAmC;AAC5D,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,OAAO,IAAI,KAAK,UAAU,OAAO,OAAO,KAAK,oBAAoB,MAAM,IAAI;AAC9F;AAKO,SAAS,OAAO,OAA+B;AACpD,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,OAAO,IAAI,KAAK,oBAAoB,MAAM,IAAI;AACjE;AAKO,SAAS,iBAAiB,OAAyC;AACxE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SACE,WAAW,OAAO,QAAQ,KAC1B,WAAW,OAAO,WAAW,KAC7B,WAAW,OAAO,aAAa;AAEnC;AAKO,SAAS,cAAc,OAAsC;AAClE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SACE,UAAU,OAAO,IAAI,KACrB,UAAU,OAAO,MAAM,KACvB,UAAU,OAAO,UAAU,KAC3B,UAAU,OAAO,iBAAiB,KAClC,UAAU,OAAO,eAAe,KAChC,UAAU,OAAO,OAAO,KACxB,UAAU,OAAO,kBAAkB,KACnC,UAAU,OAAO,cAAc,KAC/B,oBAAoB,MAAM,IAAI,KAC9B,UAAU,MAAM,SAAS,WAAW,KACpC,UAAU,MAAM,YAAY,WAAW,KACvC,UAAU,MAAM,cAAc,aAAa,KAC3C,UAAU,MAAM,OAAO,UAAU,KACjC,iBAAiB,MAAM,OAAO,KAC9B,OAAO,MAAM,IAAI;AAErB;AAKO,SAAS,aAAa,OAAqC;AAChE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,OAAO,KAAK,KAAK,UAAU,OAAO,MAAM;AAC3D;AAKO,SAAS,SAAS,OAAiC;AACxD,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,SAAS,UAAa,aAAa,MAAM,IAAI;AAEnE,SACE,UAAU,OAAO,KAAK,KACtB,UAAU,OAAO,MAAM,KACvB,UAAU,OAAO,WAAW,KAC5B,aAAa,MAAM,IAAI,KACvB,WACA,UAAU,OAAO,UAAU,KAC3B,UAAU,OAAO,iBAAiB,KAClC,UAAU,OAAO,oBAAoB,KACrC,UAAU,OAAO,UAAU,KAC3B,UAAU,OAAO,WAAW,KAC5B,UAAU,OAAO,eAAe,KAChC,UAAU,OAAO,cAAc,KAC/B,UAAU,OAAO,oBAAoB,KACrC,UAAU,OAAO,sBAAsB,KACvC,WAAW,OAAO,sCAAsC,KACxD,UAAU,OAAO,eAAe,KAChC,UAAU,MAAM,UAAU,aAAa;AAE3C;AAKO,SAAS,aAAa,OAAqC;AAChE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SACE,UAAU,OAAO,KAAK,KACtB,UAAU,OAAO,MAAM,KACvB,UAAU,OAAO,WAAW,KAC5B,UAAU,OAAO,UAAU,KAC3B,UAAU,OAAO,MAAM,KACvB,aAAa,MAAM,IAAI;AAE3B;AAKO,SAAS,OAAO,OAA+B;AACpD,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SACE,UAAU,OAAO,KAAK,KACtB,UAAU,OAAO,MAAM,KACvB,UAAU,OAAO,aAAa,KAC9B,UAAU,OAAO,UAAU,KAC3B,UAAU,OAAO,kBAAkB,KACnC,UAAU,MAAM,SAAS,YAAY,KACrC,UAAU,OAAO,MAAM,KACvB,UAAU,OAAO,SAAS,KAC1B,WAAW,OAAO,kBAAkB;AAExC;AAKO,SAAS,cAAc,OAAsC;AAClE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SACE,UAAU,OAAO,KAAK,KACtB,UAAU,OAAO,MAAM,KACvB,UAAU,OAAO,UAAU,KAC3B,UAAU,OAAO,MAAM,KACvB,UAAU,OAAO,aAAa,KAC9B,UAAU,OAAO,SAAS;AAE9B;AAKO,SAAS,oBAAoB,OAA4C;AAC9E,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,OAAO,MAAM;AAChC;AAKO,SAAS,gBAAgB,OAAwC;AACtE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SACE,UAAU,OAAO,KAAK,KACtB,UAAU,OAAO,MAAM,KACvB,UAAU,OAAO,WAAW,KAC5B,UAAU,OAAO,MAAM,KACvB,UAAU,OAAO,UAAU,KAC3B,aAAa,MAAM,IAAI,KACvB,oBAAoB,MAAM,IAAI;AAElC;AAKO,SAAS,UAAU,OAAkC;AAC1D,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SACE,UAAU,OAAO,IAAI,KACrB,oBAAoB,MAAM,IAAI,KAC9B,UAAU,MAAM,SAAS,WAAW,KACpC,UAAU,MAAM,YAAY,WAAW,KACvC,UAAU,MAAM,cAAc,aAAa,KAC3C,UAAU,MAAM,OAAO,UAAU;AAErC;AAKO,SAAS,YAAY,OAAoC;AAC9D,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,OAAO,IAAI,KAAK,oBAAoB,MAAM,IAAI;AACjE;AAKO,SAAS,yBAAyB,OAAiD;AACxF,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAAM;AACxB,QAAM,iBACJ,cAAc,UAAc,MAAM,QAAQ,SAAS,KAAK,UAAU,MAAM,CAAC,UAAU,SAAS,KAAK,CAAC;AAEpG,SACE,UAAU,OAAO,IAAI,KACrB,UAAU,OAAO,QAAQ,KACzB,UAAU,OAAO,MAAM,KACvB,oBAAoB,MAAM,GAAG,KAC7B;AAEJ;AAKO,SAAS,iBAAiB,OAAyC;AACxE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SACE,UAAU,OAAO,QAAQ,KACzB,UAAU,OAAO,WAAW,KAC5B,UAAU,OAAO,SAAS,KAC1B,yBAAyB,MAAM,KAAK;AAExC;AAKO,SAAS,QAAQ,OAAgC;AACtD,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SACE,UAAU,OAAO,IAAI,KACrB,UAAU,OAAO,QAAQ,KACzB,UAAU,OAAO,MAAM,KACvB,oBAAoB,MAAM,GAAG;AAEjC;AAKO,SAAS,SAAS,OAAiC;AACxD,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,OAAO,YAAY,KAAK,SAAS,MAAM,MAAM,KAAK,QAAQ,MAAM,KAAK;AACxF;;;AC7TA,SAAS,YACP,UACA,SACA,UACA,OACW;AACX,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,OAAO,GAAG;AACnB,UAAM,IAAI,MAAM,4CAA4C,QAAQ,IAAI;AAAA,EAC1E;AAEA,SAAO;AACT;AAEA,SAAS,+BAAsC,SAA0C;AACvF,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO,EAAE,OAAO,QAAmB;AAAA,EACrC;AAEA,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,MAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,GAAG;AACjC,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,MAAI,QAAQ,WAAW,UAAa,CAAC,SAAS,QAAQ,MAAM,GAAG;AAC7D,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB;AACF;AAEA,SAAS,UACP,UACA,SACA,UACA,OACwB;AACxB,MAAI,CAAC,UAAU;AACb,WAAO,+BAA+B,OAAO;AAAA,EAC/C;AAEA,MAAI;AACF,WAAO,sBAAsB,SAAS,KAAK;AAAA,EAC7C,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,4CAA4C,QAAQ,MAAO,MAAgB,OAAO;AAAA,IACpF;AAAA,EACF;AACF;AAKO,IAAM,kBAAqC;AAAA,EAChD,eAAe,CAAC,SAAS,aAAa,YAAY,eAAe,SAAS,UAAU,QAAQ;AAAA,EAC5F,wBAAwB,CAAC,SAAS,aAChC,UAAkB,wBAAwB,SAAS,UAAU,QAAQ;AAAA,EACvE,aAAa,CAAC,SAAS,aAAa,YAAY,aAAa,SAAS,UAAU,MAAM;AAAA,EACtF,oBAAoB,CAAC,SAAS,aAC5B,UAAsB,oBAAoB,SAAS,UAAU,YAAY;AAAA,EAC3E,qBAAqB,CAAC,SAAS,aAC7B,UAAuB,qBAAqB,SAAS,UAAU,aAAa;AAAA,EAC9E,uBAAuB,CAAC,SAAS,aAC/B,UAAyB,uBAAuB,SAAS,UAAU,eAAe;AAAA,EACpF,wBAAwB,CAAC,SAAS,aAChC,UAAyB,wBAAwB,SAAS,UAAU,eAAe;AAAA,EACrF,iBAAiB,CAAC,SAAS,aAAa,UAAmB,iBAAiB,SAAS,UAAU,SAAS;AAAA,EACxG,gBAAgB,CAAC,SAAS,aAAa,YAAY,gBAAgB,SAAS,UAAU,SAAS;AAAA,EAC/F,kBAAkB,CAAC,SAAS,aAC1B,UAAqB,kBAAkB,SAAS,UAAU,WAAW;AAAA,EACvE,sBAAsB,CAAC,SAAS,aAC9B,UAA0B,sBAAsB,SAAS,UAAU,gBAAgB;AACvF;;;ACpIO,SAAS,+BACd,OAC6E;AAC7E,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,MAAM,WAAW,YAAY,MAAM,OAAO,SAAS;AAC5E,QAAM,WAAW,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS;AAEzE,MAAI,aAAa,UAAU;AACzB,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,MAAI,MAAM,UAAU,QAAW;AAC7B,QAAI,CAAC,OAAO,UAAU,MAAM,KAAK,KAAK,MAAM,SAAS,GAAG;AACtD,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,YAAY,MAAM,SAAS;AAAA,IACnC,OAAO,WAAW,MAAM,QAAQ;AAAA,IAChC,OAAO,MAAM;AAAA,EACf;AACF;;;ACtBA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,iBAAiB,OAAyC;AACjE,SAAO,UAAU,SAAS,UAAU,UAAU,UAAU;AAC1D;AAKO,SAAS,qBACd,OAIA,QACqB;AACrB,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,OAAO;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,QAA+B;AAAA,IACnC,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA,IAC1D,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,IACvD,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,EACzD;AAEA,QAAM,iBAAiC;AAAA,IACrC,WAAW,OAAO,MAAM,cAAc,WAAW,MAAM,YAAY;AAAA,IACnE,SACE,OAAO,MAAM,YAAY,YAAY,SAAS,MAAM,OAAO,IACvD,MAAM,UACN;AAAA,IACN,QAAQ,MAAM,kBAAkB,cAAc,MAAM,SAAS;AAAA,IAC7D,SAAS,MAAM;AAAA,IACf,OACE,OAAO,MAAM,UAAU,aAAa,SAAS,MAAM,KAAK,IACpD,MAAM,QACN;AAAA,IACN,YAAY,iBAAiB,MAAM,UAAU,IAAI,MAAM,aAAa;AAAA,IACpE,kBACE,OAAO,MAAM,qBAAqB,YAAY,MAAM,mBAAmB;AAAA,IACzE,OAAO,SAAS,MAAM,KAAK,IAAK,MAAM,QAAoC;AAAA,EAC5E;AAEA,QAAM,WACJ,MAAM,WAAW,UACd,MAAM,UAAU,UAChB,MAAM,UAAU;AAErB,QAAM,oBACJ,eAAe,cAAc,UAC1B,eAAe,YAAY,UAC3B,eAAe,WAAW,UAC1B,eAAe,YAAY,UAC3B,eAAe,UAAU,UACzB,eAAe,eAAe,UAC9B,eAAe,qBAAqB,UACpC,eAAe,UAAU;AAE9B,SAAO;AAAA,IACL,OAAO,WAAW,QAAQ;AAAA,IAC1B,gBAAgB,oBAAoB,iBAAiB;AAAA,EACvD;AACF;;;ACvEO,IAAM,mBAAN,MAAuB;AAAA,EACrB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAUhD,KACL,aACA,YAC2B;AAC3B,UAAM,EAAE,OAAO,eAAe,IAAI,qBAAqB,aAAa,UAAU;AAE9E,WAAO,KAAK,KAAK,QAAQ;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,+BAA+B,KAAK;AAAA,MAC3C,SAAS;AAAA,MACT,QAAQ,gBAAgB,eAAe;AAAA,IACzC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,IAAI,WAAsB,MAA4C;AAC3E,WAAO,KAAK,KAAK,QAAQ;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM,aAAa,mBAAmB,OAAO,SAAS,CAAC,CAAC;AAAA,MACxD,SAAS;AAAA,MACT,QAAQ,gBAAgB,cAAc;AAAA,IACxC,CAAC;AAAA,EACH;AACF;;;AC9CO,SAAS,UAAU,KAAgB,SAAoC;AAC5E,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,aAAa,OAAO,GAAG,EAAE,QAAQ,SAAS,EAAE;AAClD,QAAM,gBAAgB,YAAY,WAAW,YAAY,IAAI;AAC7D,QAAM,cAAc,cAAc,WAAW,GAAG,IAAI,gBAAgB,IAAI,aAAa;AAErF,SAAO,mBAAmB,WAAW;AACvC;;;ACCO,IAAM,gBAAN,MAAoB;AAAA,EAClB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA,EAKhD,IAAI,SAAoB,MAAsC;AACnE,WAAO,KAAK,KAAK,QAAQ;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM,UAAU,UAAU,OAAO,CAAC;AAAA,MAClC,SAAS;AAAA,MACT,QAAQ,gBAAgB,WAAW;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAcO,WACL,SACA,aACA,YAC8B;AAC9B,UAAM,EAAE,OAAO,eAAe,IAAI,qBAAqB,aAAa,UAAU;AAE9E,WAAO,KAAK,KAAK,QAAQ;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM,UAAU,UAAU,OAAO,CAAC;AAAA,MAClC,OAAO,+BAA+B,KAAK;AAAA,MAC3C,SAAS;AAAA,MACT,QAAQ,gBAAgB,kBAAkB;AAAA,IAC5C,CAAC;AAAA,EACH;AACF;;;ACxDO,IAAM,iBAAN,MAAqB;AAAA,EACnB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA,EAKhD,YAAY,MAAgE;AACjF,WAAO,KAAK,KAAK,QAAQ;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,gBAAgB,oBAAoB;AAAA,IAC9C,CAAC;AAAA,EACH;AACF;;;ACZO,IAAM,oBAAN,MAAwB;AAAA,EACtB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAUhD,KACL,aACA,YAC4B;AAC5B,UAAM,EAAE,OAAO,eAAe,IAAI,qBAAqB,aAAa,UAAU;AAE9E,WAAO,KAAK,KAAK,QAAQ;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,+BAA+B,KAAK;AAAA,MAC3C,SAAS;AAAA,MACT,QAAQ,gBAAgB,gBAAgB;AAAA,IAC1C,CAAC;AAAA,EACH;AACF;;;ACzBO,IAAM,kBAAN,MAAsB;AAAA,EACpB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhD,IAAI,WAAsB,MAA0C;AACzE,WAAO,KAAK,KAAK,QAAQ;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM,YAAY,UAAU,SAAS,CAAC;AAAA,MACtC,SAAS;AAAA,MACT,QAAQ,gBAAgB,aAAa;AAAA,IACvC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,aACL,WACA,MAC4B;AAC5B,WAAO,KAAK,KAAK,QAAQ;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM,YAAY,UAAU,SAAS,CAAC;AAAA,MACtC,SAAS;AAAA,MACT,QAAQ,gBAAgB,sBAAsB;AAAA,IAChD,CAAC;AAAA,EACH;AACF;;;AC5BO,IAAM,mBAAN,MAAuB;AAAA,EACrB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAiBhD,SACL,aACA,aACA,YAC+B;AAC/B,UAAM,EAAE,OAAO,eAAe,IAAI,qBAAqB,aAAa,UAAU;AAE9E,WAAO,KAAK,KAAK,QAAQ;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM,aAAa,mBAAmB,WAAW,CAAC;AAAA,MAClD,OAAO,+BAA+B,KAAK;AAAA,MAC3C,SAAS;AAAA,MACT,QAAQ,gBAAgB,mBAAmB;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EAiBO,WACL,aACA,aACA,YACiC;AACjC,UAAM,EAAE,OAAO,eAAe,IAAI,qBAAqB,aAAa,UAAU;AAE9E,WAAO,KAAK,KAAK,QAAQ;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM,aAAa,mBAAmB,WAAW,CAAC;AAAA,MAClD,OAAO,+BAA+B,KAAK;AAAA,MAC3C,SAAS;AAAA,MACT,QAAQ,gBAAgB,qBAAqB;AAAA,IAC/C,CAAC;AAAA,EACH;AAAA,EAmBO,YACL,aACA,WACA,aACA,YACiC;AACjC,UAAM,EAAE,OAAO,eAAe,IAAI,qBAAqB,aAAa,UAAU;AAE9E,WAAO,KAAK,KAAK,QAAQ;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM,aAAa,mBAAmB,WAAW,CAAC,aAAa,mBAAmB,OAAO,SAAS,CAAC,CAAC;AAAA,MACpG,OAAO,+BAA+B,KAAK;AAAA,MAC3C,SAAS;AAAA,MACT,QAAQ,gBAAgB,sBAAsB;AAAA,IAChD,CAAC;AAAA,EACH;AACF;;;AC7GO,IAAM,mBAAN,MAAuB;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKD;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKT,YAAY,SAAkC;AACnD,SAAK,OAAO,IAAI,WAAW,OAAO;AAElC,SAAK,UAAU,IAAI,gBAAgB,KAAK,IAAI;AAC5C,SAAK,QAAQ,IAAI,cAAc,KAAK,IAAI;AACxC,SAAK,WAAW,IAAI,iBAAiB,KAAK,IAAI;AAC9C,SAAK,WAAW,IAAI,iBAAiB,KAAK,IAAI;AAC9C,SAAK,YAAY,IAAI,kBAAkB,KAAK,IAAI;AAChD,SAAK,SAAS,IAAI,eAAe,KAAK,IAAI;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKO,aAAmB;AACxB,SAAK,KAAK,WAAW;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKO,gBAAgB,UAAiC;AACtD,WAAO,KAAK,KAAK,gBAAgB,QAAQ;AAAA,EAC3C;AACF;;;ACnEO,SAAS,uBAAuB,SAAoD;AACzF,SAAO,IAAI,iBAAiB,OAAO;AACrC;;;ACoBO,SAAS,wBAAwB,SAAmD;AACzF,SAAO;AAAA,IACL,eAAe,OAAgC;AAC7C,cAAQ,iBAAiB,IAAI;AAAA,QAC3B,UAAU,MAAM;AAAA,QAChB,QAAQ,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,IACA,aAAa,OAA8B;AACzC,cAAQ,mBAAmB,IAAI;AAAA,QAC7B,UAAU,MAAM;AAAA,QAChB,QAAQ,MAAM;AAAA,QACd,YAAY,MAAM;AAAA,MACpB,CAAC;AACD,cAAQ,mBAAmB;AAAA,QACzB;AAAA,UACE,UAAU,MAAM;AAAA,UAChB,QAAQ,MAAM;AAAA,UACd,YAAY,MAAM;AAAA,QACpB;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,eAAe,OAAgC;AAC7C,cAAQ,gBAAgB,IAAI;AAAA,QAC1B,UAAU,MAAM;AAAA,QAChB,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM,MAAM;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":["normalizeHeaderName","error"]}