vibezcheck 0.1.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.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +219 -0
  3. package/dist/ai-sdk/index.d.mts +34 -0
  4. package/dist/ai-sdk/index.d.ts +34 -0
  5. package/dist/ai-sdk/index.js +982 -0
  6. package/dist/ai-sdk/index.js.map +1 -0
  7. package/dist/ai-sdk/index.mjs +944 -0
  8. package/dist/ai-sdk/index.mjs.map +1 -0
  9. package/dist/auth/index.d.mts +59 -0
  10. package/dist/auth/index.d.ts +59 -0
  11. package/dist/auth/index.js +129 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/auth/index.mjs +90 -0
  14. package/dist/auth/index.mjs.map +1 -0
  15. package/dist/billing/index.d.mts +48 -0
  16. package/dist/billing/index.d.ts +48 -0
  17. package/dist/billing/index.js +128 -0
  18. package/dist/billing/index.js.map +1 -0
  19. package/dist/billing/index.mjs +90 -0
  20. package/dist/billing/index.mjs.map +1 -0
  21. package/dist/client-MJ3tl7bz.d.mts +44 -0
  22. package/dist/client-txrE0D_D.d.ts +44 -0
  23. package/dist/customers/index.d.mts +49 -0
  24. package/dist/customers/index.d.ts +49 -0
  25. package/dist/customers/index.js +158 -0
  26. package/dist/customers/index.js.map +1 -0
  27. package/dist/customers/index.mjs +119 -0
  28. package/dist/customers/index.mjs.map +1 -0
  29. package/dist/index.d.mts +92 -0
  30. package/dist/index.d.ts +92 -0
  31. package/dist/index.js +1458 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/index.mjs +1386 -0
  34. package/dist/index.mjs.map +1 -0
  35. package/dist/meter/index.d.mts +131 -0
  36. package/dist/meter/index.d.ts +131 -0
  37. package/dist/meter/index.js +895 -0
  38. package/dist/meter/index.js.map +1 -0
  39. package/dist/meter/index.mjs +843 -0
  40. package/dist/meter/index.mjs.map +1 -0
  41. package/dist/pricing/index.d.mts +40 -0
  42. package/dist/pricing/index.d.ts +40 -0
  43. package/dist/pricing/index.js +178 -0
  44. package/dist/pricing/index.js.map +1 -0
  45. package/dist/pricing/index.mjs +146 -0
  46. package/dist/pricing/index.mjs.map +1 -0
  47. package/dist/types-CSrSmsd1.d.mts +159 -0
  48. package/dist/types-CSrSmsd1.d.ts +159 -0
  49. package/package.json +131 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/meter/client.ts","../src/meter/batcher.ts","../src/meter/extractors/openai.ts","../src/meter/extractors/anthropic.ts","../src/meter/extractors/gemini.ts","../src/meter/extractors/generic.ts","../src/meter/extractors/index.ts","../src/pricing/table.ts","../src/pricing/calculator.ts","../src/meter/stream.ts","../src/ai-sdk/with-billing.ts","../src/customers/manager.ts","../src/customers/cache.ts","../src/auth/keys.ts","../src/auth/verify.ts","../src/billing/sessions.ts","../src/meter/index.ts"],"sourcesContent":["import Stripe from 'stripe';\nimport type { MeterOptions, StreamWrapOptions, CustomerParam } from './types';\nimport { VibezMeter, createMeter } from './meter/client';\nimport { calculateCost } from './pricing/calculator';\nimport { withBilling, meteredModel } from './ai-sdk/with-billing';\nimport { CustomerManager, createCustomerManager } from './customers/manager';\nimport { ApiKeyAuth, createApiKeyAuth, extractAuthToken } from './auth';\nimport { BillingHelper, createBillingHelper } from './billing/sessions';\n\nexport * from './types';\nexport * from './meter';\nexport * from './pricing';\nexport * from './ai-sdk';\nexport * from './customers';\nexport * from './auth';\nexport * from './billing';\n\n/**\n * VibezCheck Unified Client Configuration\n */\nexport interface VibezCheckConfig extends MeterOptions {\n /** Auto-initialize CustomerManager (default: true if Stripe key present) */\n autoCustomers?: boolean;\n}\n\n/**\n * VibezCheck Unified Client Instance\n */\nexport class VibezCheckClient {\n public meter: VibezMeter;\n public customers?: CustomerManager;\n public auth?: ApiKeyAuth;\n public billing?: BillingHelper;\n private stripeClient?: Stripe;\n\n constructor(config: VibezCheckConfig = {}) {\n const apiKey = config.apiKey || process.env.STRIPE_SECRET_KEY;\n if (apiKey) {\n this.stripeClient = config.stripe || new Stripe(apiKey);\n }\n\n this.meter = new VibezMeter({\n ...config,\n stripe: this.stripeClient,\n });\n\n if (this.stripeClient) {\n this.customers = new CustomerManager({ stripe: this.stripeClient });\n this.auth = new ApiKeyAuth(this.stripeClient);\n this.billing = new BillingHelper({ stripe: this.stripeClient });\n }\n }\n\n /**\n * 1-Line Zero-Latency Stream Wrapper for OpenAI, Anthropic, Gemini, etc.\n */\n public wrapStream<T>(stream: T, options?: StreamWrapOptions): T {\n return this.meter.wrapStream(stream, options);\n }\n\n /**\n * Track token usage from a non-streaming response object\n */\n public track(response: any, options?: { customer?: CustomerParam; model?: string }) {\n return this.meter.trackUsage(response, options);\n }\n\n /**\n * 1-Line Wrapper for Vercel AI SDK LanguageModel\n */\n public withBilling<T extends object>(model: T, options?: { customer?: CustomerParam }) {\n return withBilling(model, {\n ...options,\n meter: this.meter,\n });\n }\n\n /**\n * 1-Line Universal Stream Responder for API Routes (Next.js, Express, Hono)\n */\n public async stream(params: {\n model: string;\n messages: Array<{ role: string; content: string }>;\n customer?: CustomerParam;\n temperature?: number;\n }): Promise<Response> {\n const OpenAI = (await import('openai')).default;\n const openai = new OpenAI();\n\n const responseStream = await openai.chat.completions.create({\n model: params.model,\n messages: params.messages as any,\n stream: true,\n stream_options: { include_usage: true },\n temperature: params.temperature,\n });\n\n const meteredStream = this.wrapStream(responseStream, {\n customer: params.customer,\n model: params.model,\n });\n\n const encoder = new TextEncoder();\n const readable = new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of meteredStream) {\n const text = (chunk as any).choices?.[0]?.delta?.content || '';\n if (text) {\n controller.enqueue(encoder.encode(text));\n }\n }\n controller.close();\n } catch (err) {\n controller.error(err);\n }\n },\n });\n\n return new Response(readable, {\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Transfer-Encoding': 'chunked',\n },\n });\n }\n\n /**\n * Flush pending meter events (vital for serverless runtimes)\n */\n public async flush(): Promise<void> {\n await this.meter.flush();\n }\n\n /**\n * In-memory usage statistics\n */\n public getUsageSummary() {\n return this.meter.getUsageSummary();\n }\n}\n\n/**\n * Factory to create VibezCheck client\n */\nexport function createVibezCheck(config: VibezCheckConfig = {}): VibezCheckClient {\n return new VibezCheckClient(config);\n}\n\n/**\n * vibezcheck factory alias\n */\nexport const vibezcheck = createVibezCheck;\n\n/**\n * vibescheck alias (tolerates spelling difference)\n */\nexport const vibescheck = createVibezCheck;\n\n/**\n * Singleton instance initialized with process.env\n */\nexport const vibez = createVibezCheck();\n\n/**\n * Singleton alias\n */\nexport const vibes = vibez;\n","import Stripe from 'stripe';\nimport type {\n MeterOptions,\n StreamWrapOptions,\n RecordUsageOptions,\n UsageEvent,\n UsageSummary,\n CustomerParam,\n} from '../types';\nimport { MeterBatcher } from './batcher';\nimport { detectAndExtractUsage } from './extractors';\nimport { calculateUsageCost } from '../pricing/calculator';\nimport { wrapUniversalStream } from './stream';\n\nexport class VibezMeter {\n private batcher: MeterBatcher;\n private stripeClient?: Stripe;\n private markupMultiplier?: number;\n\n constructor(options: MeterOptions = {}) {\n this.markupMultiplier = options.markupMultiplier;\n\n // Initialize Stripe client if apiKey or stripe instance is provided\n if (options.stripe) {\n this.stripeClient = options.stripe;\n } else if (options.apiKey || process.env.STRIPE_SECRET_KEY) {\n const key = options.apiKey || process.env.STRIPE_SECRET_KEY!;\n this.stripeClient = new Stripe(key, {\n appInfo: {\n name: 'vibezcheck',\n version: '0.1.0',\n url: 'https://vibezcheck.xyz',\n },\n });\n }\n\n this.batcher = new MeterBatcher({\n ...options,\n stripe: this.stripeClient,\n });\n }\n\n /**\n * Track token usage from a non-streaming response object (OpenAI, Anthropic, Gemini, etc.)\n */\n public trackUsage(\n response: any,\n options: {\n customer?: CustomerParam;\n customerId?: string;\n model?: string;\n provider?: string;\n metadata?: Record<string, string | number | boolean>;\n } = {}\n ): UsageEvent | null {\n const extracted = detectAndExtractUsage(response, options.model, options.provider);\n if (!extracted) {\n return null;\n }\n\n const model = options.model || extracted.model;\n const cost = calculateUsageCost(model, extracted.usage, this.markupMultiplier);\n const customerId =\n typeof options.customer === 'string'\n ? options.customer\n : options.customer?.id || options.customerId;\n\n const event: UsageEvent = {\n timestamp: new Date().toISOString(),\n model,\n provider: extracted.provider,\n usage: extracted.usage,\n cost,\n customerId,\n metadata: options.metadata,\n };\n\n this.batcher.enqueue(event);\n return event;\n }\n\n /**\n * Wrap any LLM stream (OpenAI, Anthropic, Gemini) with zero added latency\n */\n public wrapStream<T>(stream: T, options: StreamWrapOptions = {}): T {\n return wrapUniversalStream(stream, options, (event) => {\n this.batcher.enqueue(event);\n });\n }\n\n /**\n * Directly record token usage manually\n */\n public recordUsage(options: RecordUsageOptions): UsageEvent {\n const inputTokens = options.inputTokens ?? 0;\n const outputTokens = options.outputTokens ?? 0;\n const reasoningTokens = options.reasoningTokens;\n const cachedTokens = options.cachedTokens;\n\n const usage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n reasoningTokens,\n visibleOutputTokens:\n reasoningTokens !== undefined ? Math.max(0, outputTokens - reasoningTokens) : outputTokens,\n cachedTokens,\n };\n\n const cost = calculateUsageCost(options.model, usage, this.markupMultiplier);\n const customerId =\n typeof options.customer === 'string'\n ? options.customer\n : options.customer?.id || options.customerId;\n\n const event: UsageEvent = {\n timestamp: new Date().toISOString(),\n model: options.model,\n provider: options.provider || 'custom',\n usage,\n cost,\n customerId,\n metadata: options.metadata,\n };\n\n this.batcher.enqueue(event);\n return event;\n }\n\n /**\n * Flush pending events to Stripe (vital for Serverless & Edge environments)\n */\n public async flush(): Promise<void> {\n await this.batcher.flush();\n }\n\n /**\n * Get in-memory aggregated usage statistics\n */\n public getUsageSummary(): UsageSummary {\n return this.batcher.getSummary();\n }\n\n /**\n * Reset in-memory ledger\n */\n public resetSummary(): void {\n this.batcher.resetLedger();\n }\n}\n\n/**\n * Factory function to create a VibezMeter instance\n */\nexport function createMeter(options: MeterOptions = {}): VibezMeter {\n return new VibezMeter(options);\n}\n","import type Stripe from 'stripe';\nimport type { UsageEvent, UsageSummary, MeterOptions } from '../types';\n\nexport class MeterBatcher {\n private queue: UsageEvent[] = [];\n private timer: NodeJS.Timeout | null = null;\n private isFlushing: boolean = false;\n private readonly maxBatchSize: number;\n private readonly flushIntervalMs: number;\n private readonly stripeClient?: Stripe;\n private readonly eventName: string;\n private readonly onUsageCallback?: (event: UsageEvent) => void | Promise<void>;\n private readonly onErrorCallback?: (error: Error, events: UsageEvent[]) => void;\n private readonly debug: boolean;\n\n // In-memory ledger for local stats\n private totalRequests = 0;\n private totalTokens = 0;\n private totalInputTokens = 0;\n private totalOutputTokens = 0;\n private totalReasoningTokens = 0;\n private totalCostUSD = 0;\n private byModel: Record<string, { requests: number; tokens: number; costUSD: number }> = {};\n\n constructor(options: MeterOptions = {}) {\n this.stripeClient = options.stripe;\n this.eventName = options.eventName || 'token-billing-tokens';\n this.maxBatchSize = options.batching?.maxBatchSize ?? 50;\n this.flushIntervalMs = options.batching?.flushIntervalMs ?? 50;\n this.onUsageCallback = options.onUsage;\n this.onErrorCallback = options.onError;\n this.debug = options.debug ?? false;\n }\n\n /**\n * Enqueue a usage event for batch dispatching\n */\n public enqueue(event: UsageEvent): void {\n // 1. Update in-memory local ledger\n this.recordInLedger(event);\n\n // 2. Fire onUsage hook immediately\n if (this.onUsageCallback) {\n try {\n const res = this.onUsageCallback(event);\n if (res instanceof Promise) {\n res.catch((err) => {\n if (this.debug) console.error('[vibezcheck] Error in onUsage callback:', err);\n });\n }\n } catch (err) {\n if (this.debug) console.error('[vibezcheck] Error in onUsage callback:', err);\n }\n }\n\n // 3. If no Stripe client is configured, we're done (local mode)\n if (!this.stripeClient) {\n if (this.debug) {\n console.log(\n `[vibezcheck:local] 📊 ${event.model} | Tokens: ${event.usage.totalTokens} | Cost: $${event.cost.totalUSD.toFixed(6)}`\n );\n }\n return;\n }\n\n // 4. Queue for Stripe dispatch\n this.queue.push(event);\n\n if (this.queue.length >= this.maxBatchSize) {\n this.flush().catch((err) => {\n if (this.debug) console.error('[vibezcheck] Batch flush error:', err);\n });\n } else if (!this.timer) {\n this.timer = setTimeout(() => {\n this.timer = null;\n this.flush().catch((err) => {\n if (this.debug) console.error('[vibezcheck] Debounce flush error:', err);\n });\n }, this.flushIntervalMs);\n }\n }\n\n /**\n * Immediately flush all queued events to Stripe\n */\n public async flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n\n if (this.queue.length === 0 || !this.stripeClient || this.isFlushing) {\n return;\n }\n\n this.isFlushing = true;\n const eventsToSend = [...this.queue];\n this.queue = [];\n\n try {\n await this.sendEventsToStripe(eventsToSend);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n if (this.debug) {\n console.error('[vibezcheck] Failed to send meter events to Stripe:', err);\n }\n if (this.onErrorCallback) {\n this.onErrorCallback(err, eventsToSend);\n }\n } finally {\n this.isFlushing = false;\n // If new items were queued while flushing, trigger another flush\n if (this.queue.length > 0) {\n this.flush().catch(() => {});\n }\n }\n }\n\n /**\n * Sends events to Stripe Billing Meter Events API\n */\n private async sendEventsToStripe(events: UsageEvent[]): Promise<void> {\n if (!this.stripeClient) return;\n\n for (const event of events) {\n const customerId = event.customerId;\n if (!customerId) {\n // Skip events without customer attribution for Stripe billing\n continue;\n }\n\n const timestamp = event.timestamp || new Date().toISOString();\n const model = `${event.provider}/${event.model}`;\n\n // 1. Send Input Tokens Meter Event\n if (event.usage.inputTokens > 0) {\n try {\n await this.stripeClient.v2.billing.meterEvents.create({\n event_name: this.eventName,\n timestamp,\n payload: {\n stripe_customer_id: customerId,\n value: event.usage.inputTokens.toString(),\n model,\n token_type: 'input',\n cached_tokens: (event.usage.cachedTokens ?? 0).toString(),\n ...(event.metadata ? (event.metadata as any) : {}),\n },\n });\n } catch (e) {\n if (this.debug) console.warn('[vibezcheck] Input meter event error:', e);\n }\n }\n\n // 2. Send Output Tokens Meter Event\n if (event.usage.outputTokens > 0) {\n try {\n await this.stripeClient.v2.billing.meterEvents.create({\n event_name: this.eventName,\n timestamp,\n payload: {\n stripe_customer_id: customerId,\n value: event.usage.outputTokens.toString(),\n model,\n token_type: 'output',\n reasoning_tokens: (event.usage.reasoningTokens ?? 0).toString(),\n visible_tokens: (event.usage.visibleOutputTokens ?? event.usage.outputTokens).toString(),\n ...(event.metadata ? (event.metadata as any) : {}),\n },\n });\n } catch (e) {\n if (this.debug) console.warn('[vibezcheck] Output meter event error:', e);\n }\n }\n }\n }\n\n /**\n * Updates internal in-memory ledger\n */\n private recordInLedger(event: UsageEvent): void {\n this.totalRequests += 1;\n this.totalTokens += event.usage.totalTokens;\n this.totalInputTokens += event.usage.inputTokens;\n this.totalOutputTokens += event.usage.outputTokens;\n this.totalReasoningTokens += event.usage.reasoningTokens ?? 0;\n this.totalCostUSD += event.cost.totalUSD;\n\n const modelKey = event.model;\n if (!this.byModel[modelKey]) {\n this.byModel[modelKey] = { requests: 0, tokens: 0, costUSD: 0 };\n }\n this.byModel[modelKey].requests += 1;\n this.byModel[modelKey].tokens += event.usage.totalTokens;\n this.byModel[modelKey].costUSD += event.cost.totalUSD;\n }\n\n /**\n * Get in-memory usage summary\n */\n public getSummary(): UsageSummary {\n return {\n totalRequests: this.totalRequests,\n totalTokens: this.totalTokens,\n totalInputTokens: this.totalInputTokens,\n totalOutputTokens: this.totalOutputTokens,\n totalReasoningTokens: this.totalReasoningTokens,\n totalCostUSD: Number(this.totalCostUSD.toFixed(6)),\n byModel: { ...this.byModel },\n };\n }\n\n /**\n * Reset in-memory ledger\n */\n public resetLedger(): void {\n this.totalRequests = 0;\n this.totalTokens = 0;\n this.totalInputTokens = 0;\n this.totalOutputTokens = 0;\n this.totalReasoningTokens = 0;\n this.totalCostUSD = 0;\n this.byModel = {};\n }\n}\n","import type { TokenUsage } from '../../types';\n\nexport interface ExtractedUsage {\n model: string;\n provider: string;\n usage: TokenUsage;\n}\n\n/**\n * Extracts token usage from OpenAI synchronous responses (ChatCompletion, Responses, Embeddings)\n */\nexport function extractOpenAIResponseUsage(response: any): ExtractedUsage | null {\n if (!response || typeof response !== 'object') return null;\n\n // 1. Standard OpenAI ChatCompletion\n if ('choices' in response && 'usage' in response && response.usage) {\n const rawUsage = response.usage;\n const model = response.model || 'gpt-4o';\n\n const inputTokens = rawUsage.prompt_tokens ?? 0;\n const outputTokens = rawUsage.completion_tokens ?? 0;\n const reasoningTokens = rawUsage.completion_tokens_details?.reasoning_tokens ?? 0;\n const cachedTokens = rawUsage.prompt_tokens_details?.cached_tokens ?? 0;\n\n return {\n model,\n provider: 'openai',\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n reasoningTokens: reasoningTokens > 0 ? reasoningTokens : undefined,\n visibleOutputTokens: Math.max(0, outputTokens - reasoningTokens),\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\n },\n };\n }\n\n // 2. OpenAI Embeddings Response\n if ('data' in response && 'usage' in response && response.usage && 'model' in response) {\n const rawUsage = response.usage;\n const inputTokens = rawUsage.prompt_tokens ?? 0;\n\n return {\n model: response.model || 'text-embedding-3-small',\n provider: 'openai',\n usage: {\n inputTokens,\n outputTokens: 0,\n totalTokens: inputTokens,\n },\n };\n }\n\n // 3. OpenAI Responses API (New standard)\n if ('status' in response && 'usage' in response && response.usage) {\n const rawUsage = response.usage;\n const model = response.model || 'gpt-5.6-sol';\n\n const inputTokens = rawUsage.input_tokens ?? rawUsage.prompt_tokens ?? 0;\n const outputTokens = rawUsage.output_tokens ?? rawUsage.completion_tokens ?? 0;\n const reasoningTokens =\n rawUsage.output_token_details?.reasoning_tokens ??\n rawUsage.completion_tokens_details?.reasoning_tokens ??\n 0;\n const cachedTokens =\n rawUsage.input_token_details?.cached_tokens ??\n rawUsage.prompt_tokens_details?.cached_tokens ??\n 0;\n\n return {\n model,\n provider: 'openai',\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n reasoningTokens: reasoningTokens > 0 ? reasoningTokens : undefined,\n visibleOutputTokens: Math.max(0, outputTokens - reasoningTokens),\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\n },\n };\n }\n\n return null;\n}\n\n/**\n * Extracts token usage from an individual OpenAI stream chunk or stream accumulator\n */\nexport function inspectOpenAIStreamChunk(chunk: any): {\n model?: string;\n usage?: TokenUsage;\n} {\n if (!chunk || typeof chunk !== 'object') return {};\n\n const model = chunk.model;\n\n // Final chunk with usage object (when stream_options: { include_usage: true })\n if (chunk.usage) {\n const rawUsage = chunk.usage;\n const inputTokens = rawUsage.prompt_tokens ?? rawUsage.input_tokens ?? 0;\n const outputTokens = rawUsage.completion_tokens ?? rawUsage.output_tokens ?? 0;\n const reasoningTokens =\n rawUsage.completion_tokens_details?.reasoning_tokens ??\n rawUsage.output_token_details?.reasoning_tokens ??\n 0;\n const cachedTokens =\n rawUsage.prompt_tokens_details?.cached_tokens ??\n rawUsage.input_token_details?.cached_tokens ??\n 0;\n\n return {\n model,\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n reasoningTokens: reasoningTokens > 0 ? reasoningTokens : undefined,\n visibleOutputTokens: Math.max(0, outputTokens - reasoningTokens),\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\n },\n };\n }\n\n // Response API stream event (response.completed or response.done)\n if (chunk.type === 'response.completed' || chunk.type === 'response.done') {\n if (chunk.response?.usage) {\n const rawUsage = chunk.response.usage;\n const inputTokens = rawUsage.input_tokens ?? 0;\n const outputTokens = rawUsage.output_tokens ?? 0;\n const reasoningTokens = rawUsage.output_token_details?.reasoning_tokens ?? 0;\n const cachedTokens = rawUsage.input_token_details?.cached_tokens ?? 0;\n\n return {\n model: chunk.response.model || model,\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n reasoningTokens: reasoningTokens > 0 ? reasoningTokens : undefined,\n visibleOutputTokens: Math.max(0, outputTokens - reasoningTokens),\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\n },\n };\n }\n }\n\n return { model };\n}\n","import type { TokenUsage } from '../../types';\nimport type { ExtractedUsage } from './openai';\n\n/**\n * Extracts token usage from Anthropic synchronous responses\n */\nexport function extractAnthropicResponseUsage(response: any): ExtractedUsage | null {\n if (!response || typeof response !== 'object') return null;\n\n // Anthropic Message response has type: 'message' or role: 'assistant' with usage\n if (response.type === 'message' || ('content' in response && 'usage' in response)) {\n const rawUsage = response.usage || {};\n const model = response.model || 'claude-3-7-sonnet';\n\n const inputTokens = rawUsage.input_tokens ?? 0;\n const outputTokens = rawUsage.output_tokens ?? 0;\n const cachedTokens = rawUsage.cache_read_input_tokens ?? 0;\n const cacheWriteTokens = rawUsage.cache_creation_input_tokens ?? 0;\n\n // Check content blocks for thinking/reasoning tokens count or thinking blocks\n let reasoningTokens: number | undefined = undefined;\n if (Array.isArray(response.content)) {\n const thinkingBlocks = response.content.filter((b: any) => b.type === 'thinking');\n if (thinkingBlocks.length > 0) {\n // Approximate or extract explicit thinking tokens if present in metadata\n reasoningTokens = (rawUsage as any).thinking_tokens ?? undefined;\n }\n }\n\n return {\n model,\n provider: 'anthropic',\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n reasoningTokens,\n visibleOutputTokens:\n reasoningTokens !== undefined ? Math.max(0, outputTokens - reasoningTokens) : outputTokens,\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\n cacheWriteTokens: cacheWriteTokens > 0 ? cacheWriteTokens : undefined,\n },\n };\n }\n\n return null;\n}\n\n/**\n * Accumulates stream events across an Anthropic raw message stream\n */\nexport class AnthropicStreamAccumulator {\n private model: string = 'claude-3-7-sonnet';\n private inputTokens: number = 0;\n private outputTokens: number = 0;\n private cachedTokens: number = 0;\n private cacheWriteTokens: number = 0;\n private reasoningTokens: number = 0;\n\n processEvent(event: any): void {\n if (!event || typeof event !== 'object') return;\n\n // 1. message_start (contains model and initial input usage)\n if (event.type === 'message_start' && event.message) {\n if (event.message.model) {\n this.model = event.message.model;\n }\n if (event.message.usage) {\n this.inputTokens = event.message.usage.input_tokens ?? 0;\n this.cachedTokens = event.message.usage.cache_read_input_tokens ?? 0;\n this.cacheWriteTokens = event.message.usage.cache_creation_input_tokens ?? 0;\n }\n }\n\n // 2. message_delta (contains final output usage)\n if (event.type === 'message_delta' && event.usage) {\n this.outputTokens = event.usage.output_tokens ?? 0;\n if (event.usage.thinking_tokens) {\n this.reasoningTokens = event.usage.thinking_tokens;\n }\n }\n\n // 3. content_block_start / content_block_delta for thinking blocks\n if (event.type === 'content_block_start' && event.content_block?.type === 'thinking') {\n // thinking block detected\n }\n }\n\n getUsage(): ExtractedUsage {\n return {\n model: this.model,\n provider: 'anthropic',\n usage: {\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n totalTokens: this.inputTokens + this.outputTokens,\n reasoningTokens: this.reasoningTokens > 0 ? this.reasoningTokens : undefined,\n visibleOutputTokens:\n this.reasoningTokens > 0\n ? Math.max(0, this.outputTokens - this.reasoningTokens)\n : this.outputTokens,\n cachedTokens: this.cachedTokens > 0 ? this.cachedTokens : undefined,\n cacheWriteTokens: this.cacheWriteTokens > 0 ? this.cacheWriteTokens : undefined,\n },\n };\n }\n}\n","import type { TokenUsage } from '../../types';\nimport type { ExtractedUsage } from './openai';\n\n/**\n * Extracts token usage from Google Gemini API response or chunk\n */\nexport function extractGeminiResponseUsage(\n response: any,\n fallbackModel: string = 'gemini-3.7-flash'\n): ExtractedUsage | null {\n if (!response || typeof response !== 'object') return null;\n\n // Gemini returns usageMetadata on response or GenerateContentResult\n const usageMetadata = response.usageMetadata || response.response?.usageMetadata;\n\n if (usageMetadata) {\n const inputTokens = usageMetadata.promptTokenCount ?? 0;\n const baseOutputTokens = usageMetadata.candidatesTokenCount ?? 0;\n const thoughtsTokenCount =\n usageMetadata.thoughtsTokenCount ?? (usageMetadata as any).reasoningTokenCount ?? 0;\n const cachedTokens = usageMetadata.cachedContentTokenCount ?? 0;\n\n const totalOutput = baseOutputTokens + thoughtsTokenCount;\n const model = response.model || response.response?.model || fallbackModel;\n\n return {\n model,\n provider: 'google',\n usage: {\n inputTokens,\n outputTokens: totalOutput,\n totalTokens: inputTokens + totalOutput,\n reasoningTokens: thoughtsTokenCount > 0 ? thoughtsTokenCount : undefined,\n visibleOutputTokens: baseOutputTokens,\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\n },\n };\n }\n\n return null;\n}\n","import type { TokenUsage } from '../../types';\nimport type { ExtractedUsage } from './openai';\n\n/**\n * Extracts token usage from generic LLM provider objects (DeepSeek, Groq, Mistral, Ollama, Cohere, Together)\n */\nexport function extractGenericResponseUsage(\n response: any,\n fallbackModel: string = 'generic-llm',\n fallbackProvider: string = 'generic'\n): ExtractedUsage | null {\n if (!response || typeof response !== 'object') return null;\n\n // Check common usage property locations\n const usage = response.usage || response.token_usage || response.usageMetadata;\n\n if (usage) {\n const inputTokens =\n usage.prompt_tokens ??\n usage.input_tokens ??\n usage.promptTokenCount ??\n usage.prompt_eval_count ??\n 0;\n const outputTokens =\n usage.completion_tokens ??\n usage.output_tokens ??\n usage.candidatesTokenCount ??\n usage.eval_count ??\n 0;\n const reasoningTokens =\n usage.reasoning_tokens ??\n usage.thoughtsTokenCount ??\n usage.completion_tokens_details?.reasoning_tokens ??\n 0;\n const cachedTokens =\n usage.prompt_tokens_details?.cached_tokens ??\n usage.cached_tokens ??\n usage.cachedContentTokenCount ??\n 0;\n\n const model = response.model || fallbackModel;\n const provider = response.provider || fallbackProvider;\n\n return {\n model,\n provider,\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n reasoningTokens: reasoningTokens > 0 ? reasoningTokens : undefined,\n visibleOutputTokens: Math.max(0, outputTokens - reasoningTokens),\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\n },\n };\n }\n\n return null;\n}\n","import type { ExtractedUsage } from './openai';\nimport { extractOpenAIResponseUsage } from './openai';\nimport { extractAnthropicResponseUsage } from './anthropic';\nimport { extractGeminiResponseUsage } from './gemini';\nimport { extractGenericResponseUsage } from './generic';\n\nexport * from './openai';\nexport * from './anthropic';\nexport * from './gemini';\nexport * from './generic';\n\n/**\n * Universal polymorphic response detector\n */\nexport function detectAndExtractUsage(\n response: any,\n fallbackModel?: string,\n fallbackProvider?: string\n): ExtractedUsage | null {\n if (!response || typeof response !== 'object') return null;\n\n // 1. Try OpenAI\n const openaiResult = extractOpenAIResponseUsage(response);\n if (openaiResult) return openaiResult;\n\n // 2. Try Anthropic\n const anthropicResult = extractAnthropicResponseUsage(response);\n if (anthropicResult) return anthropicResult;\n\n // 3. Try Gemini\n const geminiResult = extractGeminiResponseUsage(response, fallbackModel);\n if (geminiResult) return geminiResult;\n\n // 4. Try Generic\n const genericResult = extractGenericResponseUsage(response, fallbackModel, fallbackProvider);\n if (genericResult) return genericResult;\n\n return null;\n}\n","import type { ModelPricingRates } from '../types';\n\n/**\n * Built-in Registry of Model Pricing (USD per 1 Million Tokens)\n * Sourced from official 2026 provider pricing tables.\n */\nexport const MODEL_PRICING_TABLE: Record<string, ModelPricingRates> = {\n // --- OpenAI ---\n 'gpt-5.6-sol': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\n 'gpt-5.6-terra': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.2 },\n 'gpt-5.6-luna': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\n 'gpt-5': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\n 'gpt-5-mini': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\n 'o1': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\n 'o1-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\n 'o3': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\n 'o3-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\n 'gpt-4o': { inputPer1M: 2.5, outputPer1M: 10.0, cachedInputPer1M: 1.25 },\n 'gpt-4o-mini': { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.075 },\n 'gpt-4.1': { inputPer1M: 2.0, outputPer1M: 8.0, cachedInputPer1M: 1.0 },\n 'gpt-4.1-nano': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.05 },\n 'text-embedding-3-small': { inputPer1M: 0.02, outputPer1M: 0.0 },\n 'text-embedding-3-large': { inputPer1M: 0.13, outputPer1M: 0.0 },\n\n // --- Anthropic ---\n 'claude-3-7-sonnet': { inputPer1M: 0.59, outputPer1M: 2.93, cachedInputPer1M: 0.3 },\n 'claude-sonnet-5': { inputPer1M: 2.0, outputPer1M: 10.0, cachedInputPer1M: 0.3 },\n 'claude-3-5-sonnet': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\n 'claude-3-5-haiku': { inputPer1M: 0.8, outputPer1M: 4.0, cachedInputPer1M: 0.08 },\n 'haiku-4.5': { inputPer1M: 1.0, outputPer1M: 5.0, cachedInputPer1M: 0.1 },\n 'claude-opus-5': { inputPer1M: 5.0, outputPer1M: 25.0, cachedInputPer1M: 1.5 },\n 'claude-3-opus': { inputPer1M: 15.0, outputPer1M: 75.0, cachedInputPer1M: 1.5 },\n\n // --- Google Gemini ---\n 'gemini-3.7-flash': { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.18 },\n 'gemini-3.1-pro': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.5 },\n 'gemini-3.5-flash': { inputPer1M: 1.5, outputPer1M: 9.0, cachedInputPer1M: 0.38 },\n 'gemini-3.1-flash-lite': { inputPer1M: 0.25, outputPer1M: 1.5, cachedInputPer1M: 0.06 },\n 'gemini-2.0-flash': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.025 },\n 'gemini-1.5-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\n 'gemini-1.5-flash': { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },\n\n // --- xAI Grok ---\n 'grok-4.6': { inputPer1M: 3.0, outputPer1M: 15.0 },\n 'grok-2': { inputPer1M: 2.0, outputPer1M: 10.0 },\n 'grok-2-vision': { inputPer1M: 2.0, outputPer1M: 10.0 },\n 'grok-beta': { inputPer1M: 5.0, outputPer1M: 15.0 },\n\n // --- Mistral ---\n 'mistral-large-3': { inputPer1M: 2.0, outputPer1M: 6.0 },\n 'mistral-large-latest': { inputPer1M: 2.0, outputPer1M: 6.0 },\n 'codestral-latest': { inputPer1M: 0.3, outputPer1M: 0.9 },\n 'mistral-small-latest': { inputPer1M: 0.2, outputPer1M: 0.6 },\n 'ministral-8b-latest': { inputPer1M: 0.1, outputPer1M: 0.1 },\n\n // --- Groq LPUs ---\n 'llama-3.3-70b-versatile': { inputPer1M: 0.59, outputPer1M: 0.79 },\n 'llama-3.1-8b-instant': { inputPer1M: 0.05, outputPer1M: 0.08 },\n 'deepseek-r1-distill-llama-70b': { inputPer1M: 0.75, outputPer1M: 0.99 },\n 'qwen-2.5-32b': { inputPer1M: 0.29, outputPer1M: 0.39 },\n\n // --- DeepSeek ---\n 'deepseek-v4-pro': { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },\n 'deepseek-v4-flash': { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },\n 'deepseek-chat': { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },\n 'deepseek-reasoner': { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },\n\n // --- Cohere ---\n 'command-r-plus': { inputPer1M: 2.5, outputPer1M: 10.0 },\n 'command-r': { inputPer1M: 0.15, outputPer1M: 0.6 },\n};\n\n/**\n * Dynamic in-memory registry allowing runtime custom price registration\n */\nconst customPricingRegistry: Record<string, ModelPricingRates> = {};\n\n/**\n * Normalize model identifier to match pricing table keys\n */\nexport function normalizeModelKey(rawModel: string): string {\n if (!rawModel) return 'unknown';\n\n let model = rawModel.toLowerCase().trim();\n\n // Strip provider prefix if present (e.g. 'openai/gpt-4o' -> 'gpt-4o')\n if (model.includes('/')) {\n model = model.split('/')[1] || model;\n }\n\n // Remove date suffixes like -20240307 or -20250219\n model = model.replace(/-\\d{8}$/, '');\n model = model.replace(/-\\d{4}-\\d{2}-\\d{2}$/, '');\n\n return model;\n}\n\n/**\n * Retrieve pricing rates for a given model\n */\nexport function getModelPricing(modelName: string): ModelPricingRates {\n const normalized = normalizeModelKey(modelName);\n\n // Check custom registry first\n if (customPricingRegistry[normalized]) {\n return customPricingRegistry[normalized];\n }\n if (customPricingRegistry[modelName]) {\n return customPricingRegistry[modelName];\n }\n\n // Check built-in table\n if (MODEL_PRICING_TABLE[normalized]) {\n return MODEL_PRICING_TABLE[normalized];\n }\n if (MODEL_PRICING_TABLE[modelName]) {\n return MODEL_PRICING_TABLE[modelName];\n }\n\n // Fallback defaults for unknown models (conservative estimates: $1.00 in, $3.00 out)\n return {\n inputPer1M: 1.0,\n outputPer1M: 3.0,\n cachedInputPer1M: 0.5,\n };\n}\n\n/**\n * Register or override pricing rates for a custom model\n */\nexport function registerModelPricing(modelName: string, rates: ModelPricingRates): void {\n const normalized = normalizeModelKey(modelName);\n customPricingRegistry[normalized] = rates;\n customPricingRegistry[modelName] = rates;\n}\n","import type { InferenceCost, TokenUsage } from '../types';\nimport { getModelPricing } from './table';\n\nexport interface CalculateCostParams {\n model: string;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedTokens?: number;\n cacheWriteTokens?: number;\n markupMultiplier?: number;\n}\n\n/**\n * Calculates exact inference cost for an LLM call or usage breakdown in USD.\n */\nexport function calculateCost(params: CalculateCostParams): InferenceCost {\n const rates = getModelPricing(params.model);\n\n const inputTokens = params.inputTokens ?? 0;\n const outputTokens = params.outputTokens ?? 0;\n const reasoningTokens = params.reasoningTokens ?? 0;\n const cachedTokens = params.cachedTokens ?? 0;\n\n // Regular input tokens (minus any cached tokens)\n const regularInputTokens = Math.max(0, inputTokens - cachedTokens);\n\n // Input costs\n const regularInputCost = (regularInputTokens / 1_000_000) * rates.inputPer1M;\n const cachedRate = rates.cachedInputPer1M ?? rates.inputPer1M * 0.5;\n const cachedInputCost = (cachedTokens / 1_000_000) * cachedRate;\n const inputCostUSD = regularInputCost + cachedInputCost;\n\n // Output costs (reasoning tokens are billed as output tokens in standard APIs)\n const outputCostUSD = (outputTokens / 1_000_000) * rates.outputPer1M;\n\n // Reasoning breakdown cost\n const reasoningRate = rates.reasoningPer1M ?? rates.outputPer1M;\n const reasoningCostUSD = (reasoningTokens / 1_000_000) * reasoningRate;\n\n // Cache savings discount\n const standardCacheCost = (cachedTokens / 1_000_000) * rates.inputPer1M;\n const cachedDiscountUSD = Math.max(0, standardCacheCost - cachedInputCost);\n\n // Total base cost\n const totalUSD = inputCostUSD + outputCostUSD;\n\n // Retail price calculation (if markup multiplier provided)\n const markup = params.markupMultiplier ?? 1.0;\n const retailUSD = markup !== 1.0 ? totalUSD * markup : undefined;\n\n return {\n inputCostUSD: Number(inputCostUSD.toFixed(8)),\n outputCostUSD: Number(outputCostUSD.toFixed(8)),\n reasoningCostUSD: reasoningTokens > 0 ? Number(reasoningCostUSD.toFixed(8)) : undefined,\n cachedDiscountUSD: cachedTokens > 0 ? Number(cachedDiscountUSD.toFixed(8)) : undefined,\n totalUSD: Number(totalUSD.toFixed(8)),\n retailUSD: retailUSD ? Number(retailUSD.toFixed(8)) : undefined,\n currency: rates.currency || 'USD',\n };\n}\n\n/**\n * Calculates cost directly from a TokenUsage object\n */\nexport function calculateUsageCost(\n model: string,\n usage: TokenUsage,\n markupMultiplier?: number\n): InferenceCost {\n return calculateCost({\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens: usage.reasoningTokens,\n cachedTokens: usage.cachedTokens,\n cacheWriteTokens: usage.cacheWriteTokens,\n markupMultiplier,\n });\n}\n","import type { UsageEvent, StreamWrapOptions } from '../types';\nimport { inspectOpenAIStreamChunk } from './extractors/openai';\nimport { AnthropicStreamAccumulator } from './extractors/anthropic';\nimport { extractGeminiResponseUsage } from './extractors/gemini';\nimport { calculateUsageCost } from '../pricing/calculator';\n\nexport type UsageDispatchedCallback = (event: UsageEvent) => void;\n\n/**\n * Wraps an OpenAI async iterable stream to capture usage at stream conclusion\n */\nexport function wrapOpenAIStream<T extends AsyncIterable<any>>(\n stream: T,\n options: StreamWrapOptions,\n onComplete: UsageDispatchedCallback\n): T {\n let detectedModel = options.model || 'gpt-4o';\n let finalUsage: any = null;\n\n const wrappedAsyncIterable = {\n async *[Symbol.asyncIterator]() {\n try {\n for await (const chunk of stream) {\n const inspected = inspectOpenAIStreamChunk(chunk);\n if (inspected.model) {\n detectedModel = inspected.model;\n }\n if (inspected.usage) {\n finalUsage = inspected.usage;\n }\n yield chunk;\n }\n } finally {\n if (finalUsage) {\n const cost = calculateUsageCost(detectedModel, finalUsage);\n const customerId =\n typeof options.customer === 'string'\n ? options.customer\n : options.customer?.id || options.customerId;\n\n const event: UsageEvent = {\n timestamp: new Date().toISOString(),\n model: detectedModel,\n provider: 'openai',\n usage: finalUsage,\n cost,\n customerId,\n metadata: options.metadata,\n };\n\n onComplete(event);\n if (options.onUsage) {\n options.onUsage(event);\n }\n }\n }\n },\n };\n\n return wrappedAsyncIterable as unknown as T;\n}\n\n/**\n * Wraps an Anthropic message stream to accumulate message_start and message_delta usage\n */\nexport function wrapAnthropicStream<T extends AsyncIterable<any>>(\n stream: T,\n options: StreamWrapOptions,\n onComplete: UsageDispatchedCallback\n): T {\n const accumulator = new AnthropicStreamAccumulator();\n\n const wrappedAsyncIterable = {\n async *[Symbol.asyncIterator]() {\n try {\n for await (const event of stream) {\n accumulator.processEvent(event);\n yield event;\n }\n } finally {\n const extracted = accumulator.getUsage();\n const model = options.model || extracted.model;\n const cost = calculateUsageCost(model, extracted.usage);\n const customerId =\n typeof options.customer === 'string'\n ? options.customer\n : options.customer?.id || options.customerId;\n\n const usageEvent: UsageEvent = {\n timestamp: new Date().toISOString(),\n model,\n provider: 'anthropic',\n usage: extracted.usage,\n cost,\n customerId,\n metadata: options.metadata,\n };\n\n onComplete(usageEvent);\n if (options.onUsage) {\n options.onUsage(usageEvent);\n }\n }\n },\n };\n\n return wrappedAsyncIterable as unknown as T;\n}\n\n/**\n * Wraps a Google Gemini GenerateContentStreamResult\n */\nexport function wrapGeminiStream(\n result: any,\n options: StreamWrapOptions,\n onComplete: UsageDispatchedCallback\n): any {\n if (!result || !result.stream) return result;\n\n const originalStream = result.stream;\n const model = options.model || 'gemini-3.7-flash';\n let lastChunkWithUsage: any = null;\n\n const wrappedStream = (async function* () {\n try {\n for await (const chunk of originalStream) {\n if (chunk.usageMetadata) {\n lastChunkWithUsage = chunk;\n }\n yield chunk;\n }\n } finally {\n if (lastChunkWithUsage) {\n const extracted = extractGeminiResponseUsage(lastChunkWithUsage, model);\n if (extracted) {\n const cost = calculateUsageCost(extracted.model, extracted.usage);\n const customerId =\n typeof options.customer === 'string'\n ? options.customer\n : options.customer?.id || options.customerId;\n\n const event: UsageEvent = {\n timestamp: new Date().toISOString(),\n model: extracted.model,\n provider: 'google',\n usage: extracted.usage,\n cost,\n customerId,\n metadata: options.metadata,\n };\n\n onComplete(event);\n if (options.onUsage) {\n options.onUsage(event);\n }\n }\n }\n }\n })();\n\n return {\n ...result,\n stream: wrappedStream,\n };\n}\n\n/**\n * Universal Stream Wrapper\n */\nexport function wrapUniversalStream<T>(\n stream: T,\n options: StreamWrapOptions = {},\n onComplete: UsageDispatchedCallback\n): T {\n if (!stream || typeof stream !== 'object') return stream;\n\n // 1. Check Gemini stream\n if ('stream' in stream && 'response' in stream) {\n return wrapGeminiStream(stream, options, onComplete);\n }\n\n // 2. Check if stream is an AsyncIterable\n if (Symbol.asyncIterator in stream) {\n // If provider is explicitly anthropic or stream looks like anthropic events\n if (options.provider === 'anthropic') {\n return wrapAnthropicStream(stream as any, options, onComplete);\n }\n // Default to OpenAI stream wrapper which detects usage chunks polymorphically\n return wrapOpenAIStream(stream as any, options, onComplete);\n }\n\n return stream;\n}\n","import type { CustomerParam, UsageEvent } from '../types';\nimport { createMeter, VibezMeter } from '../meter/client';\nimport { calculateUsageCost } from '../pricing/calculator';\n\nexport interface WithBillingOptions {\n /** Customer email, user ID, or Stripe customer ID */\n customer?: CustomerParam;\n /** Direct Stripe customer ID */\n customerId?: string;\n /** Stripe API Key override (uses STRIPE_SECRET_KEY env by default) */\n stripeApiKey?: string;\n /** Existing VibezMeter instance (optional) */\n meter?: VibezMeter;\n /** Custom meter event name */\n eventName?: string;\n /** Usage callback fired upon generation/stream completion */\n onUsage?: (event: UsageEvent) => void | Promise<void>;\n /** Custom developer metadata */\n metadata?: Record<string, string | number | boolean>;\n}\n\n/**\n * Wraps any Vercel AI SDK LanguageModel (v2 or v3) with automated Stripe billing and token metering.\n *\n * @param model - The Vercel AI SDK language model instance (e.g. openai('gpt-5.6-sol'), anthropic('claude-3-7-sonnet'))\n * @param options - Billing & customer configuration\n * @returns Decorated LanguageModel that automatically meters tokens and sends Stripe meter events\n */\nexport function withBilling<T extends object>(model: T, options: WithBillingOptions = {}): T {\n if (!model || typeof model !== 'object') {\n return model;\n }\n\n const meter =\n options.meter ||\n createMeter({\n apiKey: options.stripeApiKey,\n eventName: options.eventName,\n });\n\n const customerId =\n typeof options.customer === 'string'\n ? options.customer\n : options.customer?.id || options.customerId;\n\n const modelId = (model as any).modelId || 'unknown-model';\n const provider = (model as any).provider?.replace(/^@ai-sdk\\//, '') || 'ai-sdk';\n\n // Helper to record usage\n const handleUsage = (rawUsage: any) => {\n if (!rawUsage) return;\n\n const inputTokens = rawUsage.promptTokens ?? rawUsage.inputTokens ?? 0;\n const outputTokens = rawUsage.completionTokens ?? rawUsage.outputTokens ?? 0;\n const reasoningTokens =\n rawUsage.reasoningTokens ??\n rawUsage.completionTokensDetails?.reasoningTokens ??\n rawUsage.outputTokenDetails?.reasoningTokens ??\n 0;\n const cachedTokens =\n rawUsage.promptTokensDetails?.cachedTokens ??\n rawUsage.inputTokenDetails?.cachedTokens ??\n 0;\n\n const usage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n reasoningTokens: reasoningTokens > 0 ? reasoningTokens : undefined,\n visibleOutputTokens: Math.max(0, outputTokens - reasoningTokens),\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\n };\n\n const cost = calculateUsageCost(modelId, usage);\n\n const event: UsageEvent = {\n timestamp: new Date().toISOString(),\n model: modelId,\n provider,\n usage,\n cost,\n customerId,\n metadata: options.metadata,\n };\n\n // Record via meter batcher\n meter.recordUsage({\n model: modelId,\n provider,\n inputTokens,\n outputTokens,\n reasoningTokens: usage.reasoningTokens,\n cachedTokens: usage.cachedTokens,\n customerId,\n metadata: options.metadata,\n });\n\n if (options.onUsage) {\n options.onUsage(event);\n }\n };\n\n // Create a Proxy around the LanguageModel to intercept doGenerate and doStream\n return new Proxy(model, {\n get(target, prop, receiver) {\n const originalValue = Reflect.get(target, prop, receiver);\n\n // 1. Intercept doGenerate (synchronous generation)\n if (prop === 'doGenerate' && typeof originalValue === 'function') {\n return async function (...args: any[]) {\n const result = await originalValue.apply(target, args);\n if (result && result.usage) {\n handleUsage(result.usage);\n }\n return result;\n };\n }\n\n // 2. Intercept doStream (streaming generation)\n if (prop === 'doStream' && typeof originalValue === 'function') {\n return async function (...args: any[]) {\n const result = await originalValue.apply(target, args);\n if (!result || !result.stream) {\n return result;\n }\n\n const originalStream = result.stream;\n\n // If stream is a standard Web ReadableStream\n if (typeof (originalStream as any).getReader === 'function') {\n const reader = (originalStream as any).getReader();\n const transformedStream = new ReadableStream({\n async start(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n break;\n }\n\n // Inspect stream chunks for 'finish' usage\n if (value && typeof value === 'object') {\n if (value.type === 'finish' && value.usage) {\n handleUsage(value.usage);\n }\n }\n\n controller.enqueue(value);\n }\n } catch (err) {\n controller.error(err);\n }\n },\n });\n\n return {\n ...result,\n stream: transformedStream,\n };\n }\n\n // If stream is an AsyncIterable\n if (Symbol.asyncIterator in originalStream) {\n const wrappedAsyncIterable = {\n async *[Symbol.asyncIterator]() {\n for await (const chunk of originalStream) {\n if (chunk && typeof chunk === 'object') {\n if (chunk.type === 'finish' && chunk.usage) {\n handleUsage(chunk.usage);\n }\n }\n yield chunk;\n }\n },\n };\n\n return {\n ...result,\n stream: wrappedAsyncIterable,\n };\n }\n\n return result;\n };\n }\n\n return originalValue;\n },\n });\n}\n\n/**\n * Alias for withBilling\n */\nexport const meteredModel = withBilling;\n","import Stripe from 'stripe';\nimport { CustomerCache } from './cache';\n\nexport interface GetOrCreateCustomerParams {\n userId: string;\n email?: string;\n name?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface CustomerManagerOptions {\n apiKey?: string;\n stripe?: Stripe;\n cacheTtlMs?: number;\n}\n\nexport class CustomerManager {\n private stripe: Stripe;\n private cache: CustomerCache;\n\n constructor(options: CustomerManagerOptions = {}) {\n if (options.stripe) {\n this.stripe = options.stripe;\n } else {\n const apiKey = options.apiKey || process.env.STRIPE_SECRET_KEY;\n if (!apiKey) {\n throw new Error('[vibezcheck] Stripe API key required for customer management.');\n }\n this.stripe = new Stripe(apiKey);\n }\n\n this.cache = new CustomerCache(options.cacheTtlMs);\n }\n\n /**\n * Retrieves existing Stripe Customer or automatically provisions a new one\n */\n public async getOrCreate(\n params: GetOrCreateCustomerParams\n ): Promise<{ id: string; isNew: boolean; customer: Stripe.Customer }> {\n const cacheKey = params.userId || params.email;\n if (cacheKey) {\n const cachedId = this.cache.get(cacheKey);\n if (cachedId) {\n return {\n id: cachedId,\n isNew: false,\n customer: { id: cachedId } as Stripe.Customer,\n };\n }\n }\n\n // 1. Search by userId in Stripe metadata\n if (params.userId) {\n try {\n const searchResult = await this.stripe.customers.search({\n query: `metadata['vibez_user_id']:'${params.userId}'`,\n limit: 1,\n });\n\n if (searchResult.data.length > 0) {\n const customer = searchResult.data[0];\n if (cacheKey) this.cache.set(cacheKey, customer.id);\n if (params.email) this.cache.set(params.email, customer.id);\n return { id: customer.id, isNew: false, customer };\n }\n } catch {\n // Fallback to email search if search query is unsupported or errors\n }\n }\n\n // 2. Search by email if provided\n if (params.email) {\n const listResult = await this.stripe.customers.list({\n email: params.email,\n limit: 1,\n });\n\n if (listResult.data.length > 0) {\n const customer = listResult.data[0];\n if (cacheKey) this.cache.set(cacheKey, customer.id);\n if (params.userId) this.cache.set(params.userId, customer.id);\n return { id: customer.id, isNew: false, customer };\n }\n }\n\n // 3. Create new Customer in Stripe\n const newCustomer = await this.stripe.customers.create({\n email: params.email,\n name: params.name,\n metadata: {\n vibez_user_id: params.userId,\n created_by: 'vibezcheck',\n ...(params.metadata || {}),\n },\n });\n\n if (cacheKey) this.cache.set(cacheKey, newCustomer.id);\n if (params.userId) this.cache.set(params.userId, newCustomer.id);\n if (params.email) this.cache.set(params.email, newCustomer.id);\n\n return { id: newCustomer.id, isNew: true, customer: newCustomer };\n }\n\n /**\n * Clears in-memory resolution cache\n */\n public clearCache(): void {\n this.cache.clear();\n }\n}\n\n/**\n * Factory to create CustomerManager\n */\nexport function createCustomerManager(options: CustomerManagerOptions = {}): CustomerManager {\n return new CustomerManager(options);\n}\n","interface CacheEntry {\n customerId: string;\n expiresAt: number;\n}\n\n/**\n * In-memory Customer Resolution Cache with TTL\n */\nexport class CustomerCache {\n private cache = new Map<string, CacheEntry>();\n private readonly defaultTtlMs: number;\n\n constructor(defaultTtlMs: number = 1000 * 60 * 60) {\n // Default TTL: 1 hour\n this.defaultTtlMs = defaultTtlMs;\n }\n\n public get(key: string): string | null {\n const entry = this.cache.get(key);\n if (!entry) return null;\n\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n return null;\n }\n\n return entry.customerId;\n }\n\n public set(key: string, customerId: string, ttlMs?: number): void {\n const expiresAt = Date.now() + (ttlMs ?? this.defaultTtlMs);\n this.cache.set(key, { customerId, expiresAt });\n }\n\n public delete(key: string): void {\n this.cache.delete(key);\n }\n\n public clear(): void {\n this.cache.clear();\n }\n}\n","import * as crypto from 'crypto';\nimport Stripe from 'stripe';\n\nexport interface ApiKeyRecord {\n keyId: string;\n keyHash: string;\n customerId: string;\n userId: string;\n name?: string;\n scopes?: string[];\n createdAt: string;\n}\n\nexport interface CreateApiKeyParams {\n customerId: string;\n userId: string;\n name?: string;\n scopes?: string[];\n}\n\nexport class ApiKeyAuth {\n private stripe?: Stripe;\n\n constructor(stripe?: Stripe) {\n this.stripe = stripe;\n }\n\n /**\n * Hashes a raw API key using SHA-256\n */\n public hashKey(rawKey: string): string {\n return crypto.createHash('sha256').update(rawKey).digest('hex');\n }\n\n /**\n * Generates a new secure vz_live_... API key\n */\n public async createApiKey(params: CreateApiKeyParams): Promise<{\n apiKey: string;\n keyId: string;\n record: ApiKeyRecord;\n }> {\n const randomBytes = crypto.randomBytes(24).toString('hex');\n const apiKey = `vz_live_${randomBytes}`;\n const keyId = `key_${crypto.randomBytes(8).toString('hex')}`;\n const keyHash = this.hashKey(apiKey);\n\n const record: ApiKeyRecord = {\n keyId,\n keyHash,\n customerId: params.customerId,\n userId: params.userId,\n name: params.name,\n scopes: params.scopes,\n createdAt: new Date().toISOString(),\n };\n\n // If Stripe client is available, save key metadata to Stripe customer\n if (this.stripe && params.customerId) {\n try {\n await this.stripe.customers.update(params.customerId, {\n metadata: {\n [`vibez_key_${keyId}`]: JSON.stringify({\n hash: keyHash,\n name: params.name,\n scopes: params.scopes,\n created: record.createdAt,\n }),\n },\n });\n } catch {\n // If customer update fails, record is still returned for database storage\n }\n }\n\n return { apiKey, keyId, record };\n }\n\n /**\n * Validates a raw key against an expected hash\n */\n public verifyKeyHash(rawKey: string, expectedHash: string): boolean {\n const computedHash = this.hashKey(rawKey);\n return crypto.timingSafeEqual(Buffer.from(computedHash), Buffer.from(expectedHash));\n }\n}\n\n/**\n * Factory to create ApiKeyAuth\n */\nexport function createApiKeyAuth(options: { apiKey?: string; stripe?: Stripe } = {}): ApiKeyAuth {\n let stripeClient = options.stripe;\n if (!stripeClient && (options.apiKey || process.env.STRIPE_SECRET_KEY)) {\n stripeClient = new Stripe(options.apiKey || process.env.STRIPE_SECRET_KEY!);\n }\n return new ApiKeyAuth(stripeClient);\n}\n","import type { ApiKeyAuth } from './keys';\n\nexport interface VerifyAuthResult {\n valid: boolean;\n apiKey?: string;\n customerId?: string;\n userId?: string;\n keyId?: string;\n error?: string;\n}\n\n/**\n * Extracts and verifies Bearer API key or authorization token from Request or Header string\n */\nexport function extractAuthToken(\n reqOrHeader: Request | Headers | Record<string, string | string[] | undefined> | string\n): string | null {\n if (!reqOrHeader) return null;\n\n let authHeader: string | null = null;\n\n if (typeof reqOrHeader === 'string') {\n authHeader = reqOrHeader;\n } else if ('headers' in reqOrHeader && typeof (reqOrHeader as any).headers?.get === 'function') {\n authHeader = (reqOrHeader as any).headers.get('authorization') || (reqOrHeader as any).headers.get('x-api-key');\n } else if (typeof (reqOrHeader as any).get === 'function') {\n authHeader = (reqOrHeader as any).get('authorization') || (reqOrHeader as any).get('x-api-key');\n } else if (typeof reqOrHeader === 'object') {\n const raw =\n (reqOrHeader as any)['authorization'] ||\n (reqOrHeader as any)['Authorization'] ||\n (reqOrHeader as any)['x-api-key'] ||\n (reqOrHeader as any)['X-API-Key'];\n authHeader = Array.isArray(raw) ? raw[0] : raw;\n }\n\n if (!authHeader) return null;\n\n if (authHeader.startsWith('Bearer ')) {\n return authHeader.substring(7).trim();\n }\n\n return authHeader.trim();\n}\n","import Stripe from 'stripe';\n\nexport interface CreatePortalSessionParams {\n customerId: string;\n returnUrl: string;\n}\n\nexport interface CreateCheckoutSessionParams {\n customerId?: string;\n customerEmail?: string;\n priceId: string;\n returnUrl: string;\n mode?: 'subscription' | 'payment';\n metadata?: Record<string, string>;\n}\n\nexport interface CreateTopUpSessionParams {\n customerId: string;\n amountCents: number;\n returnUrl: string;\n currency?: string;\n}\n\nexport class BillingHelper {\n private stripe: Stripe;\n\n constructor(options: { apiKey?: string; stripe?: Stripe } = {}) {\n if (options.stripe) {\n this.stripe = options.stripe;\n } else {\n const apiKey = options.apiKey || process.env.STRIPE_SECRET_KEY;\n if (!apiKey) {\n throw new Error('[vibezcheck] Stripe API key required for billing operations.');\n }\n this.stripe = new Stripe(apiKey);\n }\n }\n\n /**\n * Creates a Stripe Customer Portal session URL where users can manage cards, view usage & invoices\n */\n public async createPortalSession(params: CreatePortalSessionParams): Promise<string> {\n const session = await this.stripe.billingPortal.sessions.create({\n customer: params.customerId,\n return_url: params.returnUrl,\n });\n return session.url;\n }\n\n /**\n * Creates a Stripe Checkout session to subscribe a customer to a metered pricing tier\n */\n public async createCheckoutSession(params: CreateCheckoutSessionParams): Promise<string> {\n const session = await this.stripe.checkout.sessions.create({\n customer: params.customerId,\n customer_email: !params.customerId ? params.customerEmail : undefined,\n line_items: [\n {\n price: params.priceId,\n quantity: 1,\n },\n ],\n mode: params.mode || 'subscription',\n success_url: `${params.returnUrl}?session_id={CHECKOUT_SESSION_ID}&status=success`,\n cancel_url: `${params.returnUrl}?status=cancelled`,\n metadata: params.metadata,\n });\n\n if (!session.url) {\n throw new Error('[vibezcheck] Failed to generate checkout session URL.');\n }\n\n return session.url;\n }\n\n /**\n * Creates a Checkout session for topping up prepaid credit wallet balance\n */\n public async createTopUpSession(params: CreateTopUpSessionParams): Promise<string> {\n const session = await this.stripe.checkout.sessions.create({\n customer: params.customerId,\n line_items: [\n {\n price_data: {\n currency: params.currency || 'usd',\n unit_amount: params.amountCents,\n product_data: {\n name: 'AI Token Credits Top-Up',\n description: `Add $${(params.amountCents / 100).toFixed(2)} in AI inference credits`,\n },\n },\n quantity: 1,\n },\n ],\n mode: 'payment',\n success_url: `${params.returnUrl}?status=success&amount=${params.amountCents}`,\n cancel_url: `${params.returnUrl}?status=cancelled`,\n metadata: {\n type: 'vibezcheck_topup',\n customerId: params.customerId,\n amountCents: params.amountCents.toString(),\n },\n });\n\n if (!session.url) {\n throw new Error('[vibezcheck] Failed to generate top-up checkout URL.');\n }\n\n return session.url;\n }\n}\n\n/**\n * Factory to create BillingHelper\n */\nexport function createBillingHelper(options: { apiKey?: string; stripe?: Stripe } = {}): BillingHelper {\n return new BillingHelper(options);\n}\n","export * from './client';\nexport * from './batcher';\nexport * from './stream';\nexport * from './extractors';\n\nimport { createMeter } from './client';\nimport type { StreamWrapOptions, CustomerParam } from '../types';\n\n// Default singleton instance\nconst defaultMeter = createMeter();\n\n/**\n * Convenient standalone stream wrapper\n */\nexport function wrapStream<T>(stream: T, options?: StreamWrapOptions): T {\n return defaultMeter.wrapStream(stream, options);\n}\n\n/**\n * Convenient standalone usage tracker\n */\nexport function trackTokens(\n response: any,\n options?: { customer?: CustomerParam; customerId?: string; model?: string }\n) {\n return defaultMeter.trackUsage(response, options);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,iBAAmB;;;ACAnB,oBAAmB;;;ACGZ,IAAM,eAAN,MAAmB;AAAA,EAChB,QAAsB,CAAC;AAAA,EACvB,QAA+B;AAAA,EAC/B,aAAsB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGT,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,eAAe;AAAA,EACf,UAAiF,CAAC;AAAA,EAE1F,YAAY,UAAwB,CAAC,GAAG;AACtC,SAAK,eAAe,QAAQ;AAC5B,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,eAAe,QAAQ,UAAU,gBAAgB;AACtD,SAAK,kBAAkB,QAAQ,UAAU,mBAAmB;AAC5D,SAAK,kBAAkB,QAAQ;AAC/B,SAAK,kBAAkB,QAAQ;AAC/B,SAAK,QAAQ,QAAQ,SAAS;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKO,QAAQ,OAAyB;AAEtC,SAAK,eAAe,KAAK;AAGzB,QAAI,KAAK,iBAAiB;AACxB,UAAI;AACF,cAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,YAAI,eAAe,SAAS;AAC1B,cAAI,MAAM,CAAC,QAAQ;AACjB,gBAAI,KAAK,MAAO,SAAQ,MAAM,2CAA2C,GAAG;AAAA,UAC9E,CAAC;AAAA,QACH;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,KAAK,MAAO,SAAQ,MAAM,2CAA2C,GAAG;AAAA,MAC9E;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,cAAc;AACtB,UAAI,KAAK,OAAO;AACd,gBAAQ;AAAA,UACN,gCAAyB,MAAM,KAAK,cAAc,MAAM,MAAM,WAAW,aAAa,MAAM,KAAK,SAAS,QAAQ,CAAC,CAAC;AAAA,QACtH;AAAA,MACF;AACA;AAAA,IACF;AAGA,SAAK,MAAM,KAAK,KAAK;AAErB,QAAI,KAAK,MAAM,UAAU,KAAK,cAAc;AAC1C,WAAK,MAAM,EAAE,MAAM,CAAC,QAAQ;AAC1B,YAAI,KAAK,MAAO,SAAQ,MAAM,mCAAmC,GAAG;AAAA,MACtE,CAAC;AAAA,IACH,WAAW,CAAC,KAAK,OAAO;AACtB,WAAK,QAAQ,WAAW,MAAM;AAC5B,aAAK,QAAQ;AACb,aAAK,MAAM,EAAE,MAAM,CAAC,QAAQ;AAC1B,cAAI,KAAK,MAAO,SAAQ,MAAM,sCAAsC,GAAG;AAAA,QACzE,CAAC;AAAA,MACH,GAAG,KAAK,eAAe;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,QAAuB;AAClC,QAAI,KAAK,OAAO;AACd,mBAAa,KAAK,KAAK;AACvB,WAAK,QAAQ;AAAA,IACf;AAEA,QAAI,KAAK,MAAM,WAAW,KAAK,CAAC,KAAK,gBAAgB,KAAK,YAAY;AACpE;AAAA,IACF;AAEA,SAAK,aAAa;AAClB,UAAM,eAAe,CAAC,GAAG,KAAK,KAAK;AACnC,SAAK,QAAQ,CAAC;AAEd,QAAI;AACF,YAAM,KAAK,mBAAmB,YAAY;AAAA,IAC5C,SAAS,OAAO;AACd,YAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACpE,UAAI,KAAK,OAAO;AACd,gBAAQ,MAAM,uDAAuD,GAAG;AAAA,MAC1E;AACA,UAAI,KAAK,iBAAiB;AACxB,aAAK,gBAAgB,KAAK,YAAY;AAAA,MACxC;AAAA,IACF,UAAE;AACA,WAAK,aAAa;AAElB,UAAI,KAAK,MAAM,SAAS,GAAG;AACzB,aAAK,MAAM,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAmB,QAAqC;AACpE,QAAI,CAAC,KAAK,aAAc;AAExB,eAAW,SAAS,QAAQ;AAC1B,YAAM,aAAa,MAAM;AACzB,UAAI,CAAC,YAAY;AAEf;AAAA,MACF;AAEA,YAAM,YAAY,MAAM,cAAa,oBAAI,KAAK,GAAE,YAAY;AAC5D,YAAM,QAAQ,GAAG,MAAM,QAAQ,IAAI,MAAM,KAAK;AAG9C,UAAI,MAAM,MAAM,cAAc,GAAG;AAC/B,YAAI;AACF,gBAAM,KAAK,aAAa,GAAG,QAAQ,YAAY,OAAO;AAAA,YACpD,YAAY,KAAK;AAAA,YACjB;AAAA,YACA,SAAS;AAAA,cACP,oBAAoB;AAAA,cACpB,OAAO,MAAM,MAAM,YAAY,SAAS;AAAA,cACxC;AAAA,cACA,YAAY;AAAA,cACZ,gBAAgB,MAAM,MAAM,gBAAgB,GAAG,SAAS;AAAA,cACxD,GAAI,MAAM,WAAY,MAAM,WAAmB,CAAC;AAAA,YAClD;AAAA,UACF,CAAC;AAAA,QACH,SAAS,GAAG;AACV,cAAI,KAAK,MAAO,SAAQ,KAAK,yCAAyC,CAAC;AAAA,QACzE;AAAA,MACF;AAGA,UAAI,MAAM,MAAM,eAAe,GAAG;AAChC,YAAI;AACF,gBAAM,KAAK,aAAa,GAAG,QAAQ,YAAY,OAAO;AAAA,YACpD,YAAY,KAAK;AAAA,YACjB;AAAA,YACA,SAAS;AAAA,cACP,oBAAoB;AAAA,cACpB,OAAO,MAAM,MAAM,aAAa,SAAS;AAAA,cACzC;AAAA,cACA,YAAY;AAAA,cACZ,mBAAmB,MAAM,MAAM,mBAAmB,GAAG,SAAS;AAAA,cAC9D,iBAAiB,MAAM,MAAM,uBAAuB,MAAM,MAAM,cAAc,SAAS;AAAA,cACvF,GAAI,MAAM,WAAY,MAAM,WAAmB,CAAC;AAAA,YAClD;AAAA,UACF,CAAC;AAAA,QACH,SAAS,GAAG;AACV,cAAI,KAAK,MAAO,SAAQ,KAAK,0CAA0C,CAAC;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,OAAyB;AAC9C,SAAK,iBAAiB;AACtB,SAAK,eAAe,MAAM,MAAM;AAChC,SAAK,oBAAoB,MAAM,MAAM;AACrC,SAAK,qBAAqB,MAAM,MAAM;AACtC,SAAK,wBAAwB,MAAM,MAAM,mBAAmB;AAC5D,SAAK,gBAAgB,MAAM,KAAK;AAEhC,UAAM,WAAW,MAAM;AACvB,QAAI,CAAC,KAAK,QAAQ,QAAQ,GAAG;AAC3B,WAAK,QAAQ,QAAQ,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,EAAE;AAAA,IAChE;AACA,SAAK,QAAQ,QAAQ,EAAE,YAAY;AACnC,SAAK,QAAQ,QAAQ,EAAE,UAAU,MAAM,MAAM;AAC7C,SAAK,QAAQ,QAAQ,EAAE,WAAW,MAAM,KAAK;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKO,aAA2B;AAChC,WAAO;AAAA,MACL,eAAe,KAAK;AAAA,MACpB,aAAa,KAAK;AAAA,MAClB,kBAAkB,KAAK;AAAA,MACvB,mBAAmB,KAAK;AAAA,MACxB,sBAAsB,KAAK;AAAA,MAC3B,cAAc,OAAO,KAAK,aAAa,QAAQ,CAAC,CAAC;AAAA,MACjD,SAAS,EAAE,GAAG,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,cAAoB;AACzB,SAAK,gBAAgB;AACrB,SAAK,cAAc;AACnB,SAAK,mBAAmB;AACxB,SAAK,oBAAoB;AACzB,SAAK,uBAAuB;AAC5B,SAAK,eAAe;AACpB,SAAK,UAAU,CAAC;AAAA,EAClB;AACF;;;ACrNO,SAAS,2BAA2B,UAAsC;AAC/E,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAGtD,MAAI,aAAa,YAAY,WAAW,YAAY,SAAS,OAAO;AAClE,UAAM,WAAW,SAAS;AAC1B,UAAM,QAAQ,SAAS,SAAS;AAEhC,UAAM,cAAc,SAAS,iBAAiB;AAC9C,UAAM,eAAe,SAAS,qBAAqB;AACnD,UAAM,kBAAkB,SAAS,2BAA2B,oBAAoB;AAChF,UAAM,eAAe,SAAS,uBAAuB,iBAAiB;AAEtE,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,aAAa,cAAc;AAAA,QAC3B,iBAAiB,kBAAkB,IAAI,kBAAkB;AAAA,QACzD,qBAAqB,KAAK,IAAI,GAAG,eAAe,eAAe;AAAA,QAC/D,cAAc,eAAe,IAAI,eAAe;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAGA,MAAI,UAAU,YAAY,WAAW,YAAY,SAAS,SAAS,WAAW,UAAU;AACtF,UAAM,WAAW,SAAS;AAC1B,UAAM,cAAc,SAAS,iBAAiB;AAE9C,WAAO;AAAA,MACL,OAAO,SAAS,SAAS;AAAA,MACzB,UAAU;AAAA,MACV,OAAO;AAAA,QACL;AAAA,QACA,cAAc;AAAA,QACd,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAGA,MAAI,YAAY,YAAY,WAAW,YAAY,SAAS,OAAO;AACjE,UAAM,WAAW,SAAS;AAC1B,UAAM,QAAQ,SAAS,SAAS;AAEhC,UAAM,cAAc,SAAS,gBAAgB,SAAS,iBAAiB;AACvE,UAAM,eAAe,SAAS,iBAAiB,SAAS,qBAAqB;AAC7E,UAAM,kBACJ,SAAS,sBAAsB,oBAC/B,SAAS,2BAA2B,oBACpC;AACF,UAAM,eACJ,SAAS,qBAAqB,iBAC9B,SAAS,uBAAuB,iBAChC;AAEF,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,aAAa,cAAc;AAAA,QAC3B,iBAAiB,kBAAkB,IAAI,kBAAkB;AAAA,QACzD,qBAAqB,KAAK,IAAI,GAAG,eAAe,eAAe;AAAA,QAC/D,cAAc,eAAe,IAAI,eAAe;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,yBAAyB,OAGvC;AACA,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,CAAC;AAEjD,QAAM,QAAQ,MAAM;AAGpB,MAAI,MAAM,OAAO;AACf,UAAM,WAAW,MAAM;AACvB,UAAM,cAAc,SAAS,iBAAiB,SAAS,gBAAgB;AACvE,UAAM,eAAe,SAAS,qBAAqB,SAAS,iBAAiB;AAC7E,UAAM,kBACJ,SAAS,2BAA2B,oBACpC,SAAS,sBAAsB,oBAC/B;AACF,UAAM,eACJ,SAAS,uBAAuB,iBAChC,SAAS,qBAAqB,iBAC9B;AAEF,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,aAAa,cAAc;AAAA,QAC3B,iBAAiB,kBAAkB,IAAI,kBAAkB;AAAA,QACzD,qBAAqB,KAAK,IAAI,GAAG,eAAe,eAAe;AAAA,QAC/D,cAAc,eAAe,IAAI,eAAe;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM,SAAS,wBAAwB,MAAM,SAAS,iBAAiB;AACzE,QAAI,MAAM,UAAU,OAAO;AACzB,YAAM,WAAW,MAAM,SAAS;AAChC,YAAM,cAAc,SAAS,gBAAgB;AAC7C,YAAM,eAAe,SAAS,iBAAiB;AAC/C,YAAM,kBAAkB,SAAS,sBAAsB,oBAAoB;AAC3E,YAAM,eAAe,SAAS,qBAAqB,iBAAiB;AAEpE,aAAO;AAAA,QACL,OAAO,MAAM,SAAS,SAAS;AAAA,QAC/B,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,aAAa,cAAc;AAAA,UAC3B,iBAAiB,kBAAkB,IAAI,kBAAkB;AAAA,UACzD,qBAAqB,KAAK,IAAI,GAAG,eAAe,eAAe;AAAA,UAC/D,cAAc,eAAe,IAAI,eAAe;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAM;AACjB;;;AC/IO,SAAS,8BAA8B,UAAsC;AAClF,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAGtD,MAAI,SAAS,SAAS,aAAc,aAAa,YAAY,WAAW,UAAW;AACjF,UAAM,WAAW,SAAS,SAAS,CAAC;AACpC,UAAM,QAAQ,SAAS,SAAS;AAEhC,UAAM,cAAc,SAAS,gBAAgB;AAC7C,UAAM,eAAe,SAAS,iBAAiB;AAC/C,UAAM,eAAe,SAAS,2BAA2B;AACzD,UAAM,mBAAmB,SAAS,+BAA+B;AAGjE,QAAI,kBAAsC;AAC1C,QAAI,MAAM,QAAQ,SAAS,OAAO,GAAG;AACnC,YAAM,iBAAiB,SAAS,QAAQ,OAAO,CAAC,MAAW,EAAE,SAAS,UAAU;AAChF,UAAI,eAAe,SAAS,GAAG;AAE7B,0BAAmB,SAAiB,mBAAmB;AAAA,MACzD;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,aAAa,cAAc;AAAA,QAC3B;AAAA,QACA,qBACE,oBAAoB,SAAY,KAAK,IAAI,GAAG,eAAe,eAAe,IAAI;AAAA,QAChF,cAAc,eAAe,IAAI,eAAe;AAAA,QAChD,kBAAkB,mBAAmB,IAAI,mBAAmB;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,IAAM,6BAAN,MAAiC;AAAA,EAC9B,QAAgB;AAAA,EAChB,cAAsB;AAAA,EACtB,eAAuB;AAAA,EACvB,eAAuB;AAAA,EACvB,mBAA2B;AAAA,EAC3B,kBAA0B;AAAA,EAElC,aAAa,OAAkB;AAC7B,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AAGzC,QAAI,MAAM,SAAS,mBAAmB,MAAM,SAAS;AACnD,UAAI,MAAM,QAAQ,OAAO;AACvB,aAAK,QAAQ,MAAM,QAAQ;AAAA,MAC7B;AACA,UAAI,MAAM,QAAQ,OAAO;AACvB,aAAK,cAAc,MAAM,QAAQ,MAAM,gBAAgB;AACvD,aAAK,eAAe,MAAM,QAAQ,MAAM,2BAA2B;AACnE,aAAK,mBAAmB,MAAM,QAAQ,MAAM,+BAA+B;AAAA,MAC7E;AAAA,IACF;AAGA,QAAI,MAAM,SAAS,mBAAmB,MAAM,OAAO;AACjD,WAAK,eAAe,MAAM,MAAM,iBAAiB;AACjD,UAAI,MAAM,MAAM,iBAAiB;AAC/B,aAAK,kBAAkB,MAAM,MAAM;AAAA,MACrC;AAAA,IACF;AAGA,QAAI,MAAM,SAAS,yBAAyB,MAAM,eAAe,SAAS,YAAY;AAAA,IAEtF;AAAA,EACF;AAAA,EAEA,WAA2B;AACzB,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,UAAU;AAAA,MACV,OAAO;AAAA,QACL,aAAa,KAAK;AAAA,QAClB,cAAc,KAAK;AAAA,QACnB,aAAa,KAAK,cAAc,KAAK;AAAA,QACrC,iBAAiB,KAAK,kBAAkB,IAAI,KAAK,kBAAkB;AAAA,QACnE,qBACE,KAAK,kBAAkB,IACnB,KAAK,IAAI,GAAG,KAAK,eAAe,KAAK,eAAe,IACpD,KAAK;AAAA,QACX,cAAc,KAAK,eAAe,IAAI,KAAK,eAAe;AAAA,QAC1D,kBAAkB,KAAK,mBAAmB,IAAI,KAAK,mBAAmB;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AACF;;;ACpGO,SAAS,2BACd,UACA,gBAAwB,oBACD;AACvB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAGtD,QAAM,gBAAgB,SAAS,iBAAiB,SAAS,UAAU;AAEnE,MAAI,eAAe;AACjB,UAAM,cAAc,cAAc,oBAAoB;AACtD,UAAM,mBAAmB,cAAc,wBAAwB;AAC/D,UAAM,qBACJ,cAAc,sBAAuB,cAAsB,uBAAuB;AACpF,UAAM,eAAe,cAAc,2BAA2B;AAE9D,UAAM,cAAc,mBAAmB;AACvC,UAAM,QAAQ,SAAS,SAAS,SAAS,UAAU,SAAS;AAE5D,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,QACL;AAAA,QACA,cAAc;AAAA,QACd,aAAa,cAAc;AAAA,QAC3B,iBAAiB,qBAAqB,IAAI,qBAAqB;AAAA,QAC/D,qBAAqB;AAAA,QACrB,cAAc,eAAe,IAAI,eAAe;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AClCO,SAAS,4BACd,UACA,gBAAwB,eACxB,mBAA2B,WACJ;AACvB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAGtD,QAAM,QAAQ,SAAS,SAAS,SAAS,eAAe,SAAS;AAEjE,MAAI,OAAO;AACT,UAAM,cACJ,MAAM,iBACN,MAAM,gBACN,MAAM,oBACN,MAAM,qBACN;AACF,UAAM,eACJ,MAAM,qBACN,MAAM,iBACN,MAAM,wBACN,MAAM,cACN;AACF,UAAM,kBACJ,MAAM,oBACN,MAAM,sBACN,MAAM,2BAA2B,oBACjC;AACF,UAAM,eACJ,MAAM,uBAAuB,iBAC7B,MAAM,iBACN,MAAM,2BACN;AAEF,UAAM,QAAQ,SAAS,SAAS;AAChC,UAAM,WAAW,SAAS,YAAY;AAEtC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,aAAa,cAAc;AAAA,QAC3B,iBAAiB,kBAAkB,IAAI,kBAAkB;AAAA,QACzD,qBAAqB,KAAK,IAAI,GAAG,eAAe,eAAe;AAAA,QAC/D,cAAc,eAAe,IAAI,eAAe;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC5CO,SAAS,sBACd,UACA,eACA,kBACuB;AACvB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAGtD,QAAM,eAAe,2BAA2B,QAAQ;AACxD,MAAI,aAAc,QAAO;AAGzB,QAAM,kBAAkB,8BAA8B,QAAQ;AAC9D,MAAI,gBAAiB,QAAO;AAG5B,QAAM,eAAe,2BAA2B,UAAU,aAAa;AACvE,MAAI,aAAc,QAAO;AAGzB,QAAM,gBAAgB,4BAA4B,UAAU,eAAe,gBAAgB;AAC3F,MAAI,cAAe,QAAO;AAE1B,SAAO;AACT;;;AChCO,IAAM,sBAAyD;AAAA;AAAA,EAEpE,eAAe,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EAC3E,iBAAiB,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EAC7E,gBAAgB,EAAE,YAAY,KAAK,aAAa,KAAK,kBAAkB,KAAK;AAAA,EAC5E,SAAS,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EACrE,cAAc,EAAE,YAAY,KAAK,aAAa,KAAK,kBAAkB,KAAK;AAAA,EAC1E,MAAM,EAAE,YAAY,IAAM,aAAa,IAAM,kBAAkB,IAAI;AAAA,EACnE,WAAW,EAAE,YAAY,KAAK,aAAa,KAAK,kBAAkB,KAAK;AAAA,EACvE,MAAM,EAAE,YAAY,IAAM,aAAa,IAAM,kBAAkB,IAAI;AAAA,EACnE,WAAW,EAAE,YAAY,KAAK,aAAa,KAAK,kBAAkB,KAAK;AAAA,EACvE,UAAU,EAAE,YAAY,KAAK,aAAa,IAAM,kBAAkB,KAAK;AAAA,EACvE,eAAe,EAAE,YAAY,MAAM,aAAa,KAAK,kBAAkB,MAAM;AAAA,EAC7E,WAAW,EAAE,YAAY,GAAK,aAAa,GAAK,kBAAkB,EAAI;AAAA,EACtE,gBAAgB,EAAE,YAAY,KAAK,aAAa,KAAK,kBAAkB,KAAK;AAAA,EAC5E,0BAA0B,EAAE,YAAY,MAAM,aAAa,EAAI;AAAA,EAC/D,0BAA0B,EAAE,YAAY,MAAM,aAAa,EAAI;AAAA;AAAA,EAG/D,qBAAqB,EAAE,YAAY,MAAM,aAAa,MAAM,kBAAkB,IAAI;AAAA,EAClF,mBAAmB,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EAC/E,qBAAqB,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EACjF,oBAAoB,EAAE,YAAY,KAAK,aAAa,GAAK,kBAAkB,KAAK;AAAA,EAChF,aAAa,EAAE,YAAY,GAAK,aAAa,GAAK,kBAAkB,IAAI;AAAA,EACxE,iBAAiB,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EAC7E,iBAAiB,EAAE,YAAY,IAAM,aAAa,IAAM,kBAAkB,IAAI;AAAA;AAAA,EAG9E,oBAAoB,EAAE,YAAY,MAAM,aAAa,MAAM,kBAAkB,KAAK;AAAA,EAClF,kBAAkB,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EAC9E,oBAAoB,EAAE,YAAY,KAAK,aAAa,GAAK,kBAAkB,KAAK;AAAA,EAChF,yBAAyB,EAAE,YAAY,MAAM,aAAa,KAAK,kBAAkB,KAAK;AAAA,EACtF,oBAAoB,EAAE,YAAY,KAAK,aAAa,KAAK,kBAAkB,MAAM;AAAA,EACjF,kBAAkB,EAAE,YAAY,MAAM,aAAa,GAAK,kBAAkB,OAAO;AAAA,EACjF,oBAAoB,EAAE,YAAY,OAAO,aAAa,KAAK,kBAAkB,QAAQ;AAAA;AAAA,EAGrF,YAAY,EAAE,YAAY,GAAK,aAAa,GAAK;AAAA,EACjD,UAAU,EAAE,YAAY,GAAK,aAAa,GAAK;AAAA,EAC/C,iBAAiB,EAAE,YAAY,GAAK,aAAa,GAAK;AAAA,EACtD,aAAa,EAAE,YAAY,GAAK,aAAa,GAAK;AAAA;AAAA,EAGlD,mBAAmB,EAAE,YAAY,GAAK,aAAa,EAAI;AAAA,EACvD,wBAAwB,EAAE,YAAY,GAAK,aAAa,EAAI;AAAA,EAC5D,oBAAoB,EAAE,YAAY,KAAK,aAAa,IAAI;AAAA,EACxD,wBAAwB,EAAE,YAAY,KAAK,aAAa,IAAI;AAAA,EAC5D,uBAAuB,EAAE,YAAY,KAAK,aAAa,IAAI;AAAA;AAAA,EAG3D,2BAA2B,EAAE,YAAY,MAAM,aAAa,KAAK;AAAA,EACjE,wBAAwB,EAAE,YAAY,MAAM,aAAa,KAAK;AAAA,EAC9D,iCAAiC,EAAE,YAAY,MAAM,aAAa,KAAK;AAAA,EACvE,gBAAgB,EAAE,YAAY,MAAM,aAAa,KAAK;AAAA;AAAA,EAGtD,mBAAmB,EAAE,YAAY,MAAM,aAAa,MAAM,kBAAkB,KAAK;AAAA,EACjF,qBAAqB,EAAE,YAAY,MAAM,aAAa,MAAM,kBAAkB,KAAK;AAAA,EACnF,iBAAiB,EAAE,YAAY,MAAM,aAAa,MAAM,kBAAkB,KAAK;AAAA,EAC/E,qBAAqB,EAAE,YAAY,MAAM,aAAa,MAAM,kBAAkB,KAAK;AAAA;AAAA,EAGnF,kBAAkB,EAAE,YAAY,KAAK,aAAa,GAAK;AAAA,EACvD,aAAa,EAAE,YAAY,MAAM,aAAa,IAAI;AACpD;AAKA,IAAM,wBAA2D,CAAC;AAK3D,SAAS,kBAAkB,UAA0B;AAC1D,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,QAAQ,SAAS,YAAY,EAAE,KAAK;AAGxC,MAAI,MAAM,SAAS,GAAG,GAAG;AACvB,YAAQ,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,EACjC;AAGA,UAAQ,MAAM,QAAQ,WAAW,EAAE;AACnC,UAAQ,MAAM,QAAQ,uBAAuB,EAAE;AAE/C,SAAO;AACT;AAKO,SAAS,gBAAgB,WAAsC;AACpE,QAAM,aAAa,kBAAkB,SAAS;AAG9C,MAAI,sBAAsB,UAAU,GAAG;AACrC,WAAO,sBAAsB,UAAU;AAAA,EACzC;AACA,MAAI,sBAAsB,SAAS,GAAG;AACpC,WAAO,sBAAsB,SAAS;AAAA,EACxC;AAGA,MAAI,oBAAoB,UAAU,GAAG;AACnC,WAAO,oBAAoB,UAAU;AAAA,EACvC;AACA,MAAI,oBAAoB,SAAS,GAAG;AAClC,WAAO,oBAAoB,SAAS;AAAA,EACtC;AAGA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,kBAAkB;AAAA,EACpB;AACF;AAKO,SAAS,qBAAqB,WAAmB,OAAgC;AACtF,QAAM,aAAa,kBAAkB,SAAS;AAC9C,wBAAsB,UAAU,IAAI;AACpC,wBAAsB,SAAS,IAAI;AACrC;;;ACtHO,SAAS,cAAc,QAA4C;AACxE,QAAM,QAAQ,gBAAgB,OAAO,KAAK;AAE1C,QAAM,cAAc,OAAO,eAAe;AAC1C,QAAM,eAAe,OAAO,gBAAgB;AAC5C,QAAM,kBAAkB,OAAO,mBAAmB;AAClD,QAAM,eAAe,OAAO,gBAAgB;AAG5C,QAAM,qBAAqB,KAAK,IAAI,GAAG,cAAc,YAAY;AAGjE,QAAM,mBAAoB,qBAAqB,MAAa,MAAM;AAClE,QAAM,aAAa,MAAM,oBAAoB,MAAM,aAAa;AAChE,QAAM,kBAAmB,eAAe,MAAa;AACrD,QAAM,eAAe,mBAAmB;AAGxC,QAAM,gBAAiB,eAAe,MAAa,MAAM;AAGzD,QAAM,gBAAgB,MAAM,kBAAkB,MAAM;AACpD,QAAM,mBAAoB,kBAAkB,MAAa;AAGzD,QAAM,oBAAqB,eAAe,MAAa,MAAM;AAC7D,QAAM,oBAAoB,KAAK,IAAI,GAAG,oBAAoB,eAAe;AAGzE,QAAM,WAAW,eAAe;AAGhC,QAAM,SAAS,OAAO,oBAAoB;AAC1C,QAAM,YAAY,WAAW,IAAM,WAAW,SAAS;AAEvD,SAAO;AAAA,IACL,cAAc,OAAO,aAAa,QAAQ,CAAC,CAAC;AAAA,IAC5C,eAAe,OAAO,cAAc,QAAQ,CAAC,CAAC;AAAA,IAC9C,kBAAkB,kBAAkB,IAAI,OAAO,iBAAiB,QAAQ,CAAC,CAAC,IAAI;AAAA,IAC9E,mBAAmB,eAAe,IAAI,OAAO,kBAAkB,QAAQ,CAAC,CAAC,IAAI;AAAA,IAC7E,UAAU,OAAO,SAAS,QAAQ,CAAC,CAAC;AAAA,IACpC,WAAW,YAAY,OAAO,UAAU,QAAQ,CAAC,CAAC,IAAI;AAAA,IACtD,UAAU,MAAM,YAAY;AAAA,EAC9B;AACF;AAKO,SAAS,mBACd,OACA,OACA,kBACe;AACf,SAAO,cAAc;AAAA,IACnB;AAAA,IACA,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,iBAAiB,MAAM;AAAA,IACvB,cAAc,MAAM;AAAA,IACpB,kBAAkB,MAAM;AAAA,IACxB;AAAA,EACF,CAAC;AACH;;;ACpEO,SAAS,iBACd,QACA,SACA,YACG;AACH,MAAI,gBAAgB,QAAQ,SAAS;AACrC,MAAI,aAAkB;AAEtB,QAAM,uBAAuB;AAAA,IAC3B,QAAQ,OAAO,aAAa,IAAI;AAC9B,UAAI;AACF,yBAAiB,SAAS,QAAQ;AAChC,gBAAM,YAAY,yBAAyB,KAAK;AAChD,cAAI,UAAU,OAAO;AACnB,4BAAgB,UAAU;AAAA,UAC5B;AACA,cAAI,UAAU,OAAO;AACnB,yBAAa,UAAU;AAAA,UACzB;AACA,gBAAM;AAAA,QACR;AAAA,MACF,UAAE;AACA,YAAI,YAAY;AACd,gBAAM,OAAO,mBAAmB,eAAe,UAAU;AACzD,gBAAM,aACJ,OAAO,QAAQ,aAAa,WACxB,QAAQ,WACR,QAAQ,UAAU,MAAM,QAAQ;AAEtC,gBAAM,QAAoB;AAAA,YACxB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,YAClC,OAAO;AAAA,YACP,UAAU;AAAA,YACV,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA,UAAU,QAAQ;AAAA,UACpB;AAEA,qBAAW,KAAK;AAChB,cAAI,QAAQ,SAAS;AACnB,oBAAQ,QAAQ,KAAK;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,oBACd,QACA,SACA,YACG;AACH,QAAM,cAAc,IAAI,2BAA2B;AAEnD,QAAM,uBAAuB;AAAA,IAC3B,QAAQ,OAAO,aAAa,IAAI;AAC9B,UAAI;AACF,yBAAiB,SAAS,QAAQ;AAChC,sBAAY,aAAa,KAAK;AAC9B,gBAAM;AAAA,QACR;AAAA,MACF,UAAE;AACA,cAAM,YAAY,YAAY,SAAS;AACvC,cAAM,QAAQ,QAAQ,SAAS,UAAU;AACzC,cAAM,OAAO,mBAAmB,OAAO,UAAU,KAAK;AACtD,cAAM,aACJ,OAAO,QAAQ,aAAa,WACxB,QAAQ,WACR,QAAQ,UAAU,MAAM,QAAQ;AAEtC,cAAM,aAAyB;AAAA,UAC7B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC;AAAA,UACA,UAAU;AAAA,UACV,OAAO,UAAU;AAAA,UACjB;AAAA,UACA;AAAA,UACA,UAAU,QAAQ;AAAA,QACpB;AAEA,mBAAW,UAAU;AACrB,YAAI,QAAQ,SAAS;AACnB,kBAAQ,QAAQ,UAAU;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,iBACd,QACA,SACA,YACK;AACL,MAAI,CAAC,UAAU,CAAC,OAAO,OAAQ,QAAO;AAEtC,QAAM,iBAAiB,OAAO;AAC9B,QAAM,QAAQ,QAAQ,SAAS;AAC/B,MAAI,qBAA0B;AAE9B,QAAM,iBAAiB,mBAAmB;AACxC,QAAI;AACF,uBAAiB,SAAS,gBAAgB;AACxC,YAAI,MAAM,eAAe;AACvB,+BAAqB;AAAA,QACvB;AACA,cAAM;AAAA,MACR;AAAA,IACF,UAAE;AACA,UAAI,oBAAoB;AACtB,cAAM,YAAY,2BAA2B,oBAAoB,KAAK;AACtE,YAAI,WAAW;AACb,gBAAM,OAAO,mBAAmB,UAAU,OAAO,UAAU,KAAK;AAChE,gBAAM,aACJ,OAAO,QAAQ,aAAa,WACxB,QAAQ,WACR,QAAQ,UAAU,MAAM,QAAQ;AAEtC,gBAAM,QAAoB;AAAA,YACxB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,YAClC,OAAO,UAAU;AAAA,YACjB,UAAU;AAAA,YACV,OAAO,UAAU;AAAA,YACjB;AAAA,YACA;AAAA,YACA,UAAU,QAAQ;AAAA,UACpB;AAEA,qBAAW,KAAK;AAChB,cAAI,QAAQ,SAAS;AACnB,oBAAQ,QAAQ,KAAK;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG;AAEH,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,EACV;AACF;AAKO,SAAS,oBACd,QACA,UAA6B,CAAC,GAC9B,YACG;AACH,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAGlD,MAAI,YAAY,UAAU,cAAc,QAAQ;AAC9C,WAAO,iBAAiB,QAAQ,SAAS,UAAU;AAAA,EACrD;AAGA,MAAI,OAAO,iBAAiB,QAAQ;AAElC,QAAI,QAAQ,aAAa,aAAa;AACpC,aAAO,oBAAoB,QAAe,SAAS,UAAU;AAAA,IAC/D;AAEA,WAAO,iBAAiB,QAAe,SAAS,UAAU;AAAA,EAC5D;AAEA,SAAO;AACT;;;ATlLO,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,UAAwB,CAAC,GAAG;AACtC,SAAK,mBAAmB,QAAQ;AAGhC,QAAI,QAAQ,QAAQ;AAClB,WAAK,eAAe,QAAQ;AAAA,IAC9B,WAAW,QAAQ,UAAU,QAAQ,IAAI,mBAAmB;AAC1D,YAAM,MAAM,QAAQ,UAAU,QAAQ,IAAI;AAC1C,WAAK,eAAe,IAAI,cAAAC,QAAO,KAAK;AAAA,QAClC,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS;AAAA,UACT,KAAK;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH;AAEA,SAAK,UAAU,IAAI,aAAa;AAAA,MAC9B,GAAG;AAAA,MACH,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,WACL,UACA,UAMI,CAAC,GACc;AACnB,UAAM,YAAY,sBAAsB,UAAU,QAAQ,OAAO,QAAQ,QAAQ;AACjF,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,QAAQ,SAAS,UAAU;AACzC,UAAM,OAAO,mBAAmB,OAAO,UAAU,OAAO,KAAK,gBAAgB;AAC7E,UAAM,aACJ,OAAO,QAAQ,aAAa,WACxB,QAAQ,WACR,QAAQ,UAAU,MAAM,QAAQ;AAEtC,UAAM,QAAoB;AAAA,MACxB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA,UAAU,UAAU;AAAA,MACpB,OAAO,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,MACA,UAAU,QAAQ;AAAA,IACpB;AAEA,SAAK,QAAQ,QAAQ,KAAK;AAC1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,WAAc,QAAW,UAA6B,CAAC,GAAM;AAClE,WAAO,oBAAoB,QAAQ,SAAS,CAAC,UAAU;AACrD,WAAK,QAAQ,QAAQ,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,YAAY,SAAyC;AAC1D,UAAM,cAAc,QAAQ,eAAe;AAC3C,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,kBAAkB,QAAQ;AAChC,UAAM,eAAe,QAAQ;AAE7B,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,aAAa,cAAc;AAAA,MAC3B;AAAA,MACA,qBACE,oBAAoB,SAAY,KAAK,IAAI,GAAG,eAAe,eAAe,IAAI;AAAA,MAChF;AAAA,IACF;AAEA,UAAM,OAAO,mBAAmB,QAAQ,OAAO,OAAO,KAAK,gBAAgB;AAC3E,UAAM,aACJ,OAAO,QAAQ,aAAa,WACxB,QAAQ,WACR,QAAQ,UAAU,MAAM,QAAQ;AAEtC,UAAM,QAAoB;AAAA,MACxB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,UAAU,QAAQ,YAAY;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,QAAQ;AAAA,IACpB;AAEA,SAAK,QAAQ,QAAQ,KAAK;AAC1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,QAAuB;AAClC,UAAM,KAAK,QAAQ,MAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAgC;AACrC,WAAO,KAAK,QAAQ,WAAW;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKO,eAAqB;AAC1B,SAAK,QAAQ,YAAY;AAAA,EAC3B;AACF;AAKO,SAAS,YAAY,UAAwB,CAAC,GAAe;AAClE,SAAO,IAAI,WAAW,OAAO;AAC/B;;;AUhIO,SAAS,YAA8B,OAAU,UAA8B,CAAC,GAAM;AAC3F,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,QACJ,QAAQ,SACR,YAAY;AAAA,IACV,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ;AAAA,EACrB,CAAC;AAEH,QAAM,aACJ,OAAO,QAAQ,aAAa,WACxB,QAAQ,WACR,QAAQ,UAAU,MAAM,QAAQ;AAEtC,QAAM,UAAW,MAAc,WAAW;AAC1C,QAAM,WAAY,MAAc,UAAU,QAAQ,cAAc,EAAE,KAAK;AAGvE,QAAM,cAAc,CAAC,aAAkB;AACrC,QAAI,CAAC,SAAU;AAEf,UAAM,cAAc,SAAS,gBAAgB,SAAS,eAAe;AACrE,UAAM,eAAe,SAAS,oBAAoB,SAAS,gBAAgB;AAC3E,UAAM,kBACJ,SAAS,mBACT,SAAS,yBAAyB,mBAClC,SAAS,oBAAoB,mBAC7B;AACF,UAAM,eACJ,SAAS,qBAAqB,gBAC9B,SAAS,mBAAmB,gBAC5B;AAEF,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,aAAa,cAAc;AAAA,MAC3B,iBAAiB,kBAAkB,IAAI,kBAAkB;AAAA,MACzD,qBAAqB,KAAK,IAAI,GAAG,eAAe,eAAe;AAAA,MAC/D,cAAc,eAAe,IAAI,eAAe;AAAA,IAClD;AAEA,UAAM,OAAO,mBAAmB,SAAS,KAAK;AAE9C,UAAM,QAAoB;AAAA,MACxB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,QAAQ;AAAA,IACpB;AAGA,UAAM,YAAY;AAAA,MAChB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,MAAM;AAAA,MACvB,cAAc,MAAM;AAAA,MACpB;AAAA,MACA,UAAU,QAAQ;AAAA,IACpB,CAAC;AAED,QAAI,QAAQ,SAAS;AACnB,cAAQ,QAAQ,KAAK;AAAA,IACvB;AAAA,EACF;AAGA,SAAO,IAAI,MAAM,OAAO;AAAA,IACtB,IAAI,QAAQ,MAAM,UAAU;AAC1B,YAAM,gBAAgB,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAGxD,UAAI,SAAS,gBAAgB,OAAO,kBAAkB,YAAY;AAChE,eAAO,kBAAmB,MAAa;AACrC,gBAAM,SAAS,MAAM,cAAc,MAAM,QAAQ,IAAI;AACrD,cAAI,UAAU,OAAO,OAAO;AAC1B,wBAAY,OAAO,KAAK;AAAA,UAC1B;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAGA,UAAI,SAAS,cAAc,OAAO,kBAAkB,YAAY;AAC9D,eAAO,kBAAmB,MAAa;AACrC,gBAAM,SAAS,MAAM,cAAc,MAAM,QAAQ,IAAI;AACrD,cAAI,CAAC,UAAU,CAAC,OAAO,QAAQ;AAC7B,mBAAO;AAAA,UACT;AAEA,gBAAM,iBAAiB,OAAO;AAG9B,cAAI,OAAQ,eAAuB,cAAc,YAAY;AAC3D,kBAAM,SAAU,eAAuB,UAAU;AACjD,kBAAM,oBAAoB,IAAI,eAAe;AAAA,cAC3C,MAAM,MAAM,YAAY;AACtB,oBAAI;AACF,yBAAO,MAAM;AACX,0BAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,wBAAI,MAAM;AACR,iCAAW,MAAM;AACjB;AAAA,oBACF;AAGA,wBAAI,SAAS,OAAO,UAAU,UAAU;AACtC,0BAAI,MAAM,SAAS,YAAY,MAAM,OAAO;AAC1C,oCAAY,MAAM,KAAK;AAAA,sBACzB;AAAA,oBACF;AAEA,+BAAW,QAAQ,KAAK;AAAA,kBAC1B;AAAA,gBACF,SAAS,KAAK;AACZ,6BAAW,MAAM,GAAG;AAAA,gBACtB;AAAA,cACF;AAAA,YACF,CAAC;AAED,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,QAAQ;AAAA,YACV;AAAA,UACF;AAGA,cAAI,OAAO,iBAAiB,gBAAgB;AAC1C,kBAAM,uBAAuB;AAAA,cAC3B,QAAQ,OAAO,aAAa,IAAI;AAC9B,iCAAiB,SAAS,gBAAgB;AACxC,sBAAI,SAAS,OAAO,UAAU,UAAU;AACtC,wBAAI,MAAM,SAAS,YAAY,MAAM,OAAO;AAC1C,kCAAY,MAAM,KAAK;AAAA,oBACzB;AAAA,kBACF;AACA,wBAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAEA,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,QAAQ;AAAA,YACV;AAAA,UACF;AAEA,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAKO,IAAM,eAAe;;;ACnM5B,IAAAC,iBAAmB;;;ACQZ,IAAM,gBAAN,MAAoB;AAAA,EACjB,QAAQ,oBAAI,IAAwB;AAAA,EAC3B;AAAA,EAEjB,YAAY,eAAuB,MAAO,KAAK,IAAI;AAEjD,SAAK,eAAe;AAAA,EACtB;AAAA,EAEO,IAAI,KAA4B;AACrC,UAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;AAChC,QAAI,CAAC,MAAO,QAAO;AAEnB,QAAI,KAAK,IAAI,IAAI,MAAM,WAAW;AAChC,WAAK,MAAM,OAAO,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEO,IAAI,KAAa,YAAoB,OAAsB;AAChE,UAAM,YAAY,KAAK,IAAI,KAAK,SAAS,KAAK;AAC9C,SAAK,MAAM,IAAI,KAAK,EAAE,YAAY,UAAU,CAAC;AAAA,EAC/C;AAAA,EAEO,OAAO,KAAmB;AAC/B,SAAK,MAAM,OAAO,GAAG;AAAA,EACvB;AAAA,EAEO,QAAc;AACnB,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;;;ADzBO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA;AAAA,EAER,YAAY,UAAkC,CAAC,GAAG;AAChD,QAAI,QAAQ,QAAQ;AAClB,WAAK,SAAS,QAAQ;AAAA,IACxB,OAAO;AACL,YAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI;AAC7C,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,+DAA+D;AAAA,MACjF;AACA,WAAK,SAAS,IAAI,eAAAC,QAAO,MAAM;AAAA,IACjC;AAEA,SAAK,QAAQ,IAAI,cAAc,QAAQ,UAAU;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,YACX,QACoE;AACpE,UAAM,WAAW,OAAO,UAAU,OAAO;AACzC,QAAI,UAAU;AACZ,YAAM,WAAW,KAAK,MAAM,IAAI,QAAQ;AACxC,UAAI,UAAU;AACZ,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,UAAU,EAAE,IAAI,SAAS;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,QAAQ;AACjB,UAAI;AACF,cAAM,eAAe,MAAM,KAAK,OAAO,UAAU,OAAO;AAAA,UACtD,OAAO,8BAA8B,OAAO,MAAM;AAAA,UAClD,OAAO;AAAA,QACT,CAAC;AAED,YAAI,aAAa,KAAK,SAAS,GAAG;AAChC,gBAAM,WAAW,aAAa,KAAK,CAAC;AACpC,cAAI,SAAU,MAAK,MAAM,IAAI,UAAU,SAAS,EAAE;AAClD,cAAI,OAAO,MAAO,MAAK,MAAM,IAAI,OAAO,OAAO,SAAS,EAAE;AAC1D,iBAAO,EAAE,IAAI,SAAS,IAAI,OAAO,OAAO,SAAS;AAAA,QACnD;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,QAAI,OAAO,OAAO;AAChB,YAAM,aAAa,MAAM,KAAK,OAAO,UAAU,KAAK;AAAA,QAClD,OAAO,OAAO;AAAA,QACd,OAAO;AAAA,MACT,CAAC;AAED,UAAI,WAAW,KAAK,SAAS,GAAG;AAC9B,cAAM,WAAW,WAAW,KAAK,CAAC;AAClC,YAAI,SAAU,MAAK,MAAM,IAAI,UAAU,SAAS,EAAE;AAClD,YAAI,OAAO,OAAQ,MAAK,MAAM,IAAI,OAAO,QAAQ,SAAS,EAAE;AAC5D,eAAO,EAAE,IAAI,SAAS,IAAI,OAAO,OAAO,SAAS;AAAA,MACnD;AAAA,IACF;AAGA,UAAM,cAAc,MAAM,KAAK,OAAO,UAAU,OAAO;AAAA,MACrD,OAAO,OAAO;AAAA,MACd,MAAM,OAAO;AAAA,MACb,UAAU;AAAA,QACR,eAAe,OAAO;AAAA,QACtB,YAAY;AAAA,QACZ,GAAI,OAAO,YAAY,CAAC;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,QAAI,SAAU,MAAK,MAAM,IAAI,UAAU,YAAY,EAAE;AACrD,QAAI,OAAO,OAAQ,MAAK,MAAM,IAAI,OAAO,QAAQ,YAAY,EAAE;AAC/D,QAAI,OAAO,MAAO,MAAK,MAAM,IAAI,OAAO,OAAO,YAAY,EAAE;AAE7D,WAAO,EAAE,IAAI,YAAY,IAAI,OAAO,MAAM,UAAU,YAAY;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKO,aAAmB;AACxB,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;AAKO,SAAS,sBAAsB,UAAkC,CAAC,GAAoB;AAC3F,SAAO,IAAI,gBAAgB,OAAO;AACpC;;;AErHA,aAAwB;AACxB,IAAAC,iBAAmB;AAmBZ,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EAER,YAAY,QAAiB;AAC3B,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,QAAQ,QAAwB;AACrC,WAAc,kBAAW,QAAQ,EAAE,OAAO,MAAM,EAAE,OAAO,KAAK;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,aAAa,QAIvB;AACD,UAAMC,eAAqB,mBAAY,EAAE,EAAE,SAAS,KAAK;AACzD,UAAM,SAAS,WAAWA,YAAW;AACrC,UAAM,QAAQ,OAAc,mBAAY,CAAC,EAAE,SAAS,KAAK,CAAC;AAC1D,UAAM,UAAU,KAAK,QAAQ,MAAM;AAEnC,UAAM,SAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,YAAY,OAAO;AAAA,MACnB,QAAQ,OAAO;AAAA,MACf,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO;AAAA,MACf,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAGA,QAAI,KAAK,UAAU,OAAO,YAAY;AACpC,UAAI;AACF,cAAM,KAAK,OAAO,UAAU,OAAO,OAAO,YAAY;AAAA,UACpD,UAAU;AAAA,YACR,CAAC,aAAa,KAAK,EAAE,GAAG,KAAK,UAAU;AAAA,cACrC,MAAM;AAAA,cACN,MAAM,OAAO;AAAA,cACb,QAAQ,OAAO;AAAA,cACf,SAAS,OAAO;AAAA,YAClB,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,OAAO,OAAO;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKO,cAAc,QAAgB,cAA+B;AAClE,UAAM,eAAe,KAAK,QAAQ,MAAM;AACxC,WAAc,uBAAgB,OAAO,KAAK,YAAY,GAAG,OAAO,KAAK,YAAY,CAAC;AAAA,EACpF;AACF;AAKO,SAAS,iBAAiB,UAAgD,CAAC,GAAe;AAC/F,MAAI,eAAe,QAAQ;AAC3B,MAAI,CAAC,iBAAiB,QAAQ,UAAU,QAAQ,IAAI,oBAAoB;AACtE,mBAAe,IAAI,eAAAC,QAAO,QAAQ,UAAU,QAAQ,IAAI,iBAAkB;AAAA,EAC5E;AACA,SAAO,IAAI,WAAW,YAAY;AACpC;;;AClFO,SAAS,iBACd,aACe;AACf,MAAI,CAAC,YAAa,QAAO;AAEzB,MAAI,aAA4B;AAEhC,MAAI,OAAO,gBAAgB,UAAU;AACnC,iBAAa;AAAA,EACf,WAAW,aAAa,eAAe,OAAQ,YAAoB,SAAS,QAAQ,YAAY;AAC9F,iBAAc,YAAoB,QAAQ,IAAI,eAAe,KAAM,YAAoB,QAAQ,IAAI,WAAW;AAAA,EAChH,WAAW,OAAQ,YAAoB,QAAQ,YAAY;AACzD,iBAAc,YAAoB,IAAI,eAAe,KAAM,YAAoB,IAAI,WAAW;AAAA,EAChG,WAAW,OAAO,gBAAgB,UAAU;AAC1C,UAAM,MACH,YAAoB,eAAe,KACnC,YAAoB,eAAe,KACnC,YAAoB,WAAW,KAC/B,YAAoB,WAAW;AAClC,iBAAa,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI;AAAA,EAC7C;AAEA,MAAI,CAAC,WAAY,QAAO;AAExB,MAAI,WAAW,WAAW,SAAS,GAAG;AACpC,WAAO,WAAW,UAAU,CAAC,EAAE,KAAK;AAAA,EACtC;AAEA,SAAO,WAAW,KAAK;AACzB;;;AC3CA,IAAAC,iBAAmB;AAuBZ,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EAER,YAAY,UAAgD,CAAC,GAAG;AAC9D,QAAI,QAAQ,QAAQ;AAClB,WAAK,SAAS,QAAQ;AAAA,IACxB,OAAO;AACL,YAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI;AAC7C,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,8DAA8D;AAAA,MAChF;AACA,WAAK,SAAS,IAAI,eAAAC,QAAO,MAAM;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,oBAAoB,QAAoD;AACnF,UAAM,UAAU,MAAM,KAAK,OAAO,cAAc,SAAS,OAAO;AAAA,MAC9D,UAAU,OAAO;AAAA,MACjB,YAAY,OAAO;AAAA,IACrB,CAAC;AACD,WAAO,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,sBAAsB,QAAsD;AACvF,UAAM,UAAU,MAAM,KAAK,OAAO,SAAS,SAAS,OAAO;AAAA,MACzD,UAAU,OAAO;AAAA,MACjB,gBAAgB,CAAC,OAAO,aAAa,OAAO,gBAAgB;AAAA,MAC5D,YAAY;AAAA,QACV;AAAA,UACE,OAAO,OAAO;AAAA,UACd,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,MACA,MAAM,OAAO,QAAQ;AAAA,MACrB,aAAa,GAAG,OAAO,SAAS;AAAA,MAChC,YAAY,GAAG,OAAO,SAAS;AAAA,MAC/B,UAAU,OAAO;AAAA,IACnB,CAAC;AAED,QAAI,CAAC,QAAQ,KAAK;AAChB,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAEA,WAAO,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBAAmB,QAAmD;AACjF,UAAM,UAAU,MAAM,KAAK,OAAO,SAAS,SAAS,OAAO;AAAA,MACzD,UAAU,OAAO;AAAA,MACjB,YAAY;AAAA,QACV;AAAA,UACE,YAAY;AAAA,YACV,UAAU,OAAO,YAAY;AAAA,YAC7B,aAAa,OAAO;AAAA,YACpB,cAAc;AAAA,cACZ,MAAM;AAAA,cACN,aAAa,SAAS,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA,YAC5D;AAAA,UACF;AAAA,UACA,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,MACA,MAAM;AAAA,MACN,aAAa,GAAG,OAAO,SAAS,0BAA0B,OAAO,WAAW;AAAA,MAC5E,YAAY,GAAG,OAAO,SAAS;AAAA,MAC/B,UAAU;AAAA,QACR,MAAM;AAAA,QACN,YAAY,OAAO;AAAA,QACnB,aAAa,OAAO,YAAY,SAAS;AAAA,MAC3C;AAAA,IACF,CAAC;AAED,QAAI,CAAC,QAAQ,KAAK;AAChB,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAEA,WAAO,QAAQ;AAAA,EACjB;AACF;AAKO,SAAS,oBAAoB,UAAgD,CAAC,GAAkB;AACrG,SAAO,IAAI,cAAc,OAAO;AAClC;;;AC5GA,IAAM,eAAe,YAAY;AAK1B,SAAS,WAAc,QAAW,SAAgC;AACvE,SAAO,aAAa,WAAW,QAAQ,OAAO;AAChD;AAKO,SAAS,YACd,UACA,SACA;AACA,SAAO,aAAa,WAAW,UAAU,OAAO;AAClD;;;AjBEO,IAAM,mBAAN,MAAuB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACC;AAAA,EAER,YAAY,SAA2B,CAAC,GAAG;AACzC,UAAM,SAAS,OAAO,UAAU,QAAQ,IAAI;AAC5C,QAAI,QAAQ;AACV,WAAK,eAAe,OAAO,UAAU,IAAI,eAAAC,QAAO,MAAM;AAAA,IACxD;AAEA,SAAK,QAAQ,IAAI,WAAW;AAAA,MAC1B,GAAG;AAAA,MACH,QAAQ,KAAK;AAAA,IACf,CAAC;AAED,QAAI,KAAK,cAAc;AACrB,WAAK,YAAY,IAAI,gBAAgB,EAAE,QAAQ,KAAK,aAAa,CAAC;AAClE,WAAK,OAAO,IAAI,WAAW,KAAK,YAAY;AAC5C,WAAK,UAAU,IAAI,cAAc,EAAE,QAAQ,KAAK,aAAa,CAAC;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,WAAc,QAAW,SAAgC;AAC9D,WAAO,KAAK,MAAM,WAAW,QAAQ,OAAO;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKO,MAAM,UAAe,SAAwD;AAClF,WAAO,KAAK,MAAM,WAAW,UAAU,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKO,YAA8B,OAAU,SAAwC;AACrF,WAAO,YAAY,OAAO;AAAA,MACxB,GAAG;AAAA,MACH,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAO,QAKE;AACpB,UAAM,UAAU,MAAM,OAAO,QAAQ,GAAG;AACxC,UAAM,SAAS,IAAI,OAAO;AAE1B,UAAM,iBAAiB,MAAM,OAAO,KAAK,YAAY,OAAO;AAAA,MAC1D,OAAO,OAAO;AAAA,MACd,UAAU,OAAO;AAAA,MACjB,QAAQ;AAAA,MACR,gBAAgB,EAAE,eAAe,KAAK;AAAA,MACtC,aAAa,OAAO;AAAA,IACtB,CAAC;AAED,UAAM,gBAAgB,KAAK,WAAW,gBAAgB;AAAA,MACpD,UAAU,OAAO;AAAA,MACjB,OAAO,OAAO;AAAA,IAChB,CAAC;AAED,UAAM,UAAU,IAAI,YAAY;AAChC,UAAM,WAAW,IAAI,eAAe;AAAA,MAClC,MAAM,MAAM,YAAY;AACtB,YAAI;AACF,2BAAiB,SAAS,eAAe;AACvC,kBAAM,OAAQ,MAAc,UAAU,CAAC,GAAG,OAAO,WAAW;AAC5D,gBAAI,MAAM;AACR,yBAAW,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,YACzC;AAAA,UACF;AACA,qBAAW,MAAM;AAAA,QACnB,SAAS,KAAK;AACZ,qBAAW,MAAM,GAAG;AAAA,QACtB;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,IAAI,SAAS,UAAU;AAAA,MAC5B,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,qBAAqB;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,QAAuB;AAClC,UAAM,KAAK,MAAM,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAkB;AACvB,WAAO,KAAK,MAAM,gBAAgB;AAAA,EACpC;AACF;AAKO,SAAS,iBAAiB,SAA2B,CAAC,GAAqB;AAChF,SAAO,IAAI,iBAAiB,MAAM;AACpC;AAKO,IAAM,aAAa;AAKnB,IAAM,aAAa;AAKnB,IAAM,QAAQ,iBAAiB;AAK/B,IAAM,QAAQ;","names":["import_stripe","Stripe","import_stripe","Stripe","import_stripe","randomBytes","Stripe","import_stripe","Stripe","Stripe"]}