From e8072ba42348b8410a151bf205481312893c2d79 Mon Sep 17 00:00:00 2001
From: Yash Dewasthale
Date: Sun, 19 Jul 2026 22:29:07 +0530
Subject: [PATCH 1/4] feat: add OrcaRouter provider support and update context
windows: - Introduced OrcaRouterService for handling interactions with the
OrcaRouter API. - Updated context windows to include new models from
OrcaRouter and adjusted pricing for existing models. - Enhanced provider
management to support OrcaRouter in connection and model selection processes.
---
apps/supercode-cli/server/package.json | 2 +-
.../server/src/cli/ai/context-windows.ts | 6 +
.../server/src/cli/ai/orcarouter-service.ts | 269 ++++++++++++++++++
.../server/src/cli/ai/provider.ts | 17 +-
.../src/cli/commands/slashCommands/connect.ts | 1 +
.../src/cli/commands/slashCommands/model.ts | 21 +-
.../server/src/config/orcarouter.config.ts | 6 +
.../server/src/lib/cli-config.ts | 2 +
apps/supercode-cli/server/src/lib/pricing.ts | 8 +
9 files changed, 329 insertions(+), 3 deletions(-)
create mode 100644 apps/supercode-cli/server/src/cli/ai/orcarouter-service.ts
create mode 100644 apps/supercode-cli/server/src/config/orcarouter.config.ts
diff --git a/apps/supercode-cli/server/package.json b/apps/supercode-cli/server/package.json
index 60a5f02..4ab51c1 100644
--- a/apps/supercode-cli/server/package.json
+++ b/apps/supercode-cli/server/package.json
@@ -1,6 +1,6 @@
{
"name": "supercode-cli",
- "version": "0.1.77",
+ "version": "0.1.78",
"description": "AI-powered coding agent CLI",
"main": "dist/main.js",
"bin": {
diff --git a/apps/supercode-cli/server/src/cli/ai/context-windows.ts b/apps/supercode-cli/server/src/cli/ai/context-windows.ts
index 15b6e2e..87efb94 100644
--- a/apps/supercode-cli/server/src/cli/ai/context-windows.ts
+++ b/apps/supercode-cli/server/src/cli/ai/context-windows.ts
@@ -21,6 +21,12 @@ const CONTEXT_WINDOWS: Record = {
"anthropic/claude-opus-4-8": 1_000_000,
"anthropic/claude-opus-4-7": 1_000_000,
"openai/gpt-5.5": 1_100_000,
+ "anthropic/claude-sonnet-4.6": 200_000,
+ "anthropic/claude-opus-4.7": 200_000,
+ "deepseek/deepseek-chat": 128_000,
+ "deepseek/deepseek-reasoner": 128_000,
+ "grok/grok-4-fast-reasoning": 131_072,
+ "orcarouter/auto": 128_000,
}
const FALLBACK_CONTEXT_WINDOW = 128_000
diff --git a/apps/supercode-cli/server/src/cli/ai/orcarouter-service.ts b/apps/supercode-cli/server/src/cli/ai/orcarouter-service.ts
new file mode 100644
index 0000000..cbaf779
--- /dev/null
+++ b/apps/supercode-cli/server/src/cli/ai/orcarouter-service.ts
@@ -0,0 +1,269 @@
+import { createOpenAICompatible } from "@ai-sdk/openai-compatible"
+import { streamText, stepCountIs, type ModelMessage, type LanguageModel, type LanguageModelUsage } from "ai"
+import chalk from "chalk"
+import { orcarouterConfig } from "../../config/orcarouter.config.ts"
+import { recordUsage } from "../../lib/track-usage"
+import { computeCost } from "../../lib/pricing"
+import { isEmptyToolResult, isDeniedToolResult, summarizeToolResult, tcName } from "./tool-result"
+
+const HIGH_VALUE_MODELS: string[] = []
+
+export class OrcaRouterService {
+ model: LanguageModel
+ readonly modelName: string
+
+ constructor(modelName?: string) {
+ if (!orcarouterConfig.apiKey) {
+ throw new Error(
+ "OrcaRouter is not configured.\n\n Set ORCAROUTER_API_KEY in your environment:\n" +
+ " export ORCAROUTER_API_KEY=\n\n" +
+ " Get a key at: https://orcarouter.ai",
+ )
+ }
+
+ this.modelName = modelName || orcarouterConfig.model
+
+ const client = createOpenAICompatible({
+ name: "orcarouter",
+ baseURL: orcarouterConfig.baseUrl,
+ headers: { Authorization: `Bearer ${orcarouterConfig.apiKey}` },
+ })
+
+ this.model = client.chatModel(this.modelName)
+ }
+
+ async sendMessage(
+ messages: ModelMessage[],
+ onChunk?: (chunk: string) => void,
+ tools?: any,
+ onToolCall?: any,
+ signal?: AbortSignal,
+ onReasoning?: (chunk: string) => void,
+ onToolResult?: (params: { toolName: string; args: unknown; result: string }) => void,
+ onStepFinish?: (params: { stepNumber: number; toolCalls: Array<{ toolName: string; args: unknown }>; toolResults: Array<{ toolName: string; args: unknown; result: string }> }) => void,
+ ) {
+ const streamAbortController = new AbortController()
+ const streamTimeout = setTimeout(() => streamAbortController.abort(), 120_000)
+ const signalHandler = signal ? () => streamAbortController.abort() : undefined
+ signalHandler && signal!.addEventListener("abort", signalHandler, { once: true })
+
+ try {
+ const systemMessages = messages.filter(m => m.role === "system")
+ const nonSystemMessages = messages.filter(m => m.role !== "system")
+ const system = systemMessages.map(m => m.content).join("\n")
+
+ const hasTools = tools && Object.keys(tools).length > 0
+
+ if (!hasTools) {
+ const result = streamText({
+ model: this.model,
+ messages: nonSystemMessages,
+ system,
+ abortSignal: streamAbortController.signal,
+ ...(!HIGH_VALUE_MODELS.includes(this.modelName) ? { maxOutputTokens: 8192 } : {}),
+ })
+
+ let fullResponse = ""
+ for await (const chunk of result.textStream) {
+ fullResponse += chunk
+ onChunk?.(chunk)
+ }
+
+ const [finishReason, usage] = await Promise.all([
+ result.finishReason,
+ result.usage,
+ ])
+
+ recordUsage({
+ provider: "orcarouter",
+ model: this.modelName,
+ inputTokens: usage.inputTokens ?? 0,
+ outputTokens: usage.outputTokens ?? 0,
+ cachedInputTokens: usage.inputTokenDetails?.cacheReadTokens ?? 0,
+ totalTokens: usage.totalTokens ?? 0,
+ costUsd: computeCost(this.modelName, usage.inputTokens ?? 0, usage.outputTokens ?? 0, usage.inputTokenDetails?.cacheReadTokens ?? 0),
+ durationMs: null,
+ })
+
+ return {
+ content: fullResponse,
+ finishReason,
+ usage,
+ }
+ }
+
+ let fullResponse = ""
+ const seenStepResults: Array<{ toolName: string; result: string }> = []
+ const deniedCounts = new Map()
+ let stopForDenialLoop = false
+ const toolCallHistory: Array<{ toolName: string; argsKey: string }> = []
+ let stopForRepetition = false
+
+ const result = streamText({
+ model: this.model,
+ messages: nonSystemMessages,
+ system,
+ tools,
+ ...(!HIGH_VALUE_MODELS.includes(this.modelName) ? { maxOutputTokens: 8192 } : {} as Record),
+ stopWhen: stepCountIs(8),
+ abortSignal: streamAbortController.signal,
+ prepareStep: async ({ messages }) => {
+ if (stopForRepetition) {
+ return {
+ messages: [
+ ...messages,
+ {
+ role: "system" as const,
+ content:
+ "SYSTEM NOTICE: You have called the same tools with the same arguments " +
+ "multiple times without making progress. Stop repeating yourself. " +
+ "Analyze what you already have and respond to the user.",
+ },
+ ],
+ }
+ }
+ if (stopForDenialLoop) {
+ return {
+ messages: [
+ ...messages,
+ {
+ role: "system" as const,
+ content:
+ "SYSTEM NOTICE: You have called the same permission-protected tool multiple " +
+ "times after the user denied it. Stop calling it. Respond to the user with " +
+ "what you have so far and ask for guidance.",
+ },
+ ],
+ }
+ }
+ if (seenStepResults.length === 0) return undefined
+ const allEmpty = seenStepResults.every((r) => isEmptyToolResult(r.result))
+ if (!allEmpty) return undefined
+ const summary = seenStepResults
+ .map((r) => `- ${r.toolName}: ${summarizeToolResult(r.result)}`)
+ .join("\n")
+ return {
+ messages: [
+ ...messages,
+ {
+ role: "system" as const,
+ content:
+ "SYSTEM NOTICE: All tool calls so far have returned empty or error results. " +
+ "You have NO source material to answer with. Do NOT invent specifications, pricing, " +
+ "dates, leaderboard rankings, or any factual claims. Tell the user which tools failed " +
+ "and what you would need to proceed.\n\nTool outcomes:\n" + summary,
+ },
+ ],
+ }
+ },
+ onStepFinish: async (event) => {
+ if (event.toolCalls?.length) {
+ for (const tc of event.toolCalls) {
+ onToolCall?.({ toolName: tc.toolName, args: (tc as any).input as Record })
+ const args = (tc as any).input ?? {}
+ const argsKey = JSON.stringify(args, Object.keys(args).sort())
+ toolCallHistory.push({ toolName: tc.toolName, argsKey })
+ let repCount = 0
+ for (const h of toolCallHistory) {
+ if (h.toolName === tc.toolName && h.argsKey === argsKey) repCount++
+ }
+ if (repCount >= 3) stopForRepetition = true
+ if (toolCallHistory.length > 12) {
+ toolCallHistory.splice(0, toolCallHistory.length - 12)
+ }
+ }
+ }
+ const inputByCallId = new Map()
+ if (event.toolCalls?.length) {
+ for (const tc of event.toolCalls) {
+ const id = (tc as any).toolCallId
+ if (typeof id === "string") {
+ inputByCallId.set(id, (tc as any).input)
+ }
+ }
+ }
+ const toolResults = (event as any).toolResults as
+ | Array<{ toolName?: string; toolCallId?: string; input?: unknown; output?: unknown }>
+ | undefined
+ if (toolResults?.length) {
+ for (const tr of toolResults) {
+ const name = tcName(tr.toolName) ?? "unknown"
+ const out = (tr as any).output
+ const text =
+ typeof out === "string"
+ ? out
+ : out === undefined || out === null
+ ? ""
+ : JSON.stringify(out)
+ seenStepResults.push({ toolName: name, result: text })
+ const args = tr.input ?? (tr.toolCallId ? inputByCallId.get(tr.toolCallId) : undefined)
+ if (onToolResult) {
+ onToolResult({ toolName: name, args, result: text })
+ }
+ if (isDeniedToolResult(text)) {
+ const prev = deniedCounts.get(name) ?? 0
+ const next = prev + 1
+ deniedCounts.set(name, next)
+ if (next >= 2) stopForDenialLoop = true
+ } else {
+ deniedCounts.set(name, 0)
+ }
+ }
+ }
+ },
+ })
+
+ for await (const chunk of result.textStream) {
+ fullResponse += chunk
+ onChunk?.(chunk)
+ }
+
+ const [finishReason, usage] = await Promise.all([
+ result.finishReason,
+ result.usage,
+ ])
+
+ recordUsage({
+ provider: "orcarouter",
+ model: this.modelName,
+ inputTokens: usage.inputTokens ?? 0,
+ outputTokens: usage.outputTokens ?? 0,
+ cachedInputTokens: usage.inputTokenDetails?.cacheReadTokens ?? 0,
+ totalTokens: usage.totalTokens ?? 0,
+ costUsd: computeCost(this.modelName, usage.inputTokens ?? 0, usage.outputTokens ?? 0, usage.inputTokenDetails?.cacheReadTokens ?? 0),
+ durationMs: null,
+ })
+
+ return {
+ content: fullResponse,
+ finishReason,
+ usage,
+ }
+ } catch (error: any) {
+ if (error?.name === "AbortError") throw error
+ const msg = error instanceof Error ? error.message : String(error)
+ const is5xx = /OrcaRouter (?:API )?5\d\d/.test(msg) || /status code 5\d\d/i.test(msg)
+ if (is5xx) {
+ const friendly = new Error(
+ `OrcaRouter gateway error (HTTP 5xx). This is upstream — not your request. ` +
+ `Try again, or run /model to switch providers.\n ${msg}`,
+ )
+ console.error(chalk.red("OrcaRouter Service Error:"), friendly.message)
+ throw friendly
+ }
+ console.error(chalk.red("OrcaRouter Service Error:"), msg)
+ throw error
+ } finally {
+ clearTimeout(streamTimeout)
+ if (signalHandler) signal!.removeEventListener("abort", signalHandler as any)
+ }
+ }
+
+ async getMessage(messages: ModelMessage[], tools?: any) {
+ let fullResponse = ""
+ const result = await this.sendMessage(messages, (chunk) => {
+ fullResponse += chunk
+ })
+ return result.content
+ }
+}
diff --git a/apps/supercode-cli/server/src/cli/ai/provider.ts b/apps/supercode-cli/server/src/cli/ai/provider.ts
index 49913e1..5184f65 100644
--- a/apps/supercode-cli/server/src/cli/ai/provider.ts
+++ b/apps/supercode-cli/server/src/cli/ai/provider.ts
@@ -5,14 +5,16 @@ import { OpenRouterService } from "./openrouter-service.ts"
import { NvidiaService } from "./nvidia-service.ts"
import { ConcentrateService } from "./concentrate-service.ts"
import { MergeDevService } from "./mergedev-service.ts"
+import { OrcaRouterService } from "./orcarouter-service.ts"
import { ServerProxyService } from "./server-proxy-service.ts"
import { config } from "../../config/google.config.ts"
import { minimaxConfig } from "../../config/minimax.config.ts"
import { openRouterConfig } from "../../config/openrouter.config.ts"
import { nvidiaConfig } from "../../config/nvidia.config.ts"
import { mergedevConfig } from "../../config/mergedev.config.ts"
+import { orcarouterConfig } from "../../config/orcarouter.config.ts"
-export type ModelProvider = "supercode" | "google" | "minimax" | "openrouter" | "nvidia" | "concentrateai" | "mergedev"
+export type ModelProvider = "supercode" | "google" | "minimax" | "openrouter" | "nvidia" | "concentrateai" | "mergedev" | "orcarouter"
export type ConnectionType = "direct" | "proxy"
@@ -47,6 +49,7 @@ export const providerMeta: Record string> = {
@@ -57,6 +60,7 @@ const providerConfigs: Record string> = {
nvidia: () => process.env.NVIDIA_BYOK_PROD_KEY || process.env.NVIDIA_BYOK_DEV_KEY || nvidiaConfig.apiKey,
concentrateai: () => process.env.CONCENTRATE_BYOK_PROD_KEY || process.env.CONCENTRATE_BYOK_DEV_KEY || process.env.CONCENTRATEAI_API_KEY || "",
mergedev: () => process.env.MERGE_DEV_BYOK_PROD_KEY || process.env.MERGE_DEV_BYOK_DEV_KEY || mergedevConfig.apiKey,
+ orcarouter: () => process.env.ORCAROUTER_BYOK_PROD_KEY || process.env.ORCAROUTER_BYOK_DEV_KEY || orcarouterConfig.apiKey,
}
export function createProvider(provider: ModelProvider, model?: string): AIProvider {
@@ -142,6 +146,17 @@ export function createProvider(provider: ModelProvider, model?: string): AIProvi
svc.sendMessage(messages, onChunk, tools, onToolCall, signal, onReasoning, onToolResult, onStepFinish),
}
}
+ case "orcarouter": {
+ const svc = new OrcaRouterService(model)
+ return {
+ name: "orcarouter",
+ modelName: svc.modelName,
+ connectionType: "direct",
+ model: svc.model,
+ sendMessage: (messages, onChunk, tools, onToolCall, signal, onReasoning, onToolResult, onStepFinish) =>
+ svc.sendMessage(messages, onChunk, tools, onToolCall, signal, onReasoning, onToolResult, onStepFinish),
+ }
+ }
default: {
throw new Error(`Provider "${provider}" is paused or unavailable`)
}
diff --git a/apps/supercode-cli/server/src/cli/commands/slashCommands/connect.ts b/apps/supercode-cli/server/src/cli/commands/slashCommands/connect.ts
index 3294e9e..a58651e 100644
--- a/apps/supercode-cli/server/src/cli/commands/slashCommands/connect.ts
+++ b/apps/supercode-cli/server/src/cli/commands/slashCommands/connect.ts
@@ -15,6 +15,7 @@ const PROVIDERS: Array<{ value: ModelProvider; label: string; hint: string; link
{ value: "google", label: "Google Gemini", hint: "gemini-2.5 models", link: "https://aistudio.google.com/apikey" },
{ value: "openrouter", label: "OpenRouter", hint: "multi-provider access", link: "https://openrouter.ai/keys" },
{ value: "nvidia", label: "NVIDIA NIM", hint: "free NVIDIA hosted models", link: "https://build.nvidia.com/explore/discover" },
+ { value: "orcarouter", label: "OrcaRouter", hint: "multi-provider router", link: "https://orcarouter.ai" },
]
export async function connectProvider(): Promise<{ type: "connect"; provider?: ModelProvider; model?: string }> {
diff --git a/apps/supercode-cli/server/src/cli/commands/slashCommands/model.ts b/apps/supercode-cli/server/src/cli/commands/slashCommands/model.ts
index 2b7ba6d..9113257 100644
--- a/apps/supercode-cli/server/src/cli/commands/slashCommands/model.ts
+++ b/apps/supercode-cli/server/src/cli/commands/slashCommands/model.ts
@@ -21,12 +21,14 @@ const SECTION_GOOGLE = "__section_google__"
const SECTION_MINIMAX = "__section_minimax__"
const SECTION_NVIDIA = "__section_nvidia__"
const SECTION_OPENROUTER = "__section_openrouter__"
+const SECTION_ORCAROUTER = "__section_orcarouter__"
export const ALL_SECTIONS = new Set([
SECTION_CLOUD, SECTION_BYOK,
SECTION_CONCENTRATEAI, SECTION_MERGEDEV,
SECTION_GOOGLE, SECTION_MINIMAX,
SECTION_NVIDIA, SECTION_OPENROUTER,
+ SECTION_ORCAROUTER,
])
const SECTION_LABELS: Record = {
@@ -38,6 +40,7 @@ const SECTION_LABELS: Record = {
[SECTION_MINIMAX]: "MiniMax",
[SECTION_NVIDIA]: "NVIDIA NIM",
[SECTION_OPENROUTER]: "OpenRouter",
+ [SECTION_ORCAROUTER]: "OrcaRouter",
}
const isMainSection = (v: string) => v === SECTION_CLOUD || v === SECTION_BYOK
@@ -164,6 +167,22 @@ export const BYOK_MODELS: ModelEntry[] = [
{ value: "minimax/minimax-m3", label: "MiniMax M3", provider: "openrouter", cost: "3.0x", desc: "Via OpenRouter" },
{ value: "z-ai/glm-5.1", label: "GLM 5.1", provider: "openrouter", cost: "1.0x", desc: "Via OpenRouter" },
{ value: "moonshotai/kimi-k2.6", label: "Kimi K2.6", provider: "openrouter", cost: "1.5x", desc: "Via OpenRouter" },
+
+ // ── OrcaRouter ──────────────────────────────────────────────
+ { value: SECTION_ORCAROUTER, label: "OrcaRouter", provider: "orcarouter", cost: "", desc: "" },
+ { value: "openai/gpt-4o-mini", label: "GPT-4o Mini", provider: "orcarouter", cost: "0.5x", desc: "Cheap & fast" },
+ { value: "openai/gpt-4o", label: "GPT-4o", provider: "orcarouter", cost: "4x", desc: "OpenAI flagship" },
+ { value: "openai/gpt-4.1", label: "GPT-4.1", provider: "orcarouter", cost: "3x", desc: "Latest GPT" },
+ { value: "openai/o3-mini", label: "o3-mini", provider: "orcarouter", cost: "3x", desc: "Reasoning mini" },
+ { value: "openai/o4-mini", label: "o4-mini", provider: "orcarouter", cost: "3x", desc: "Reasoning v4 mini" },
+ { value: "anthropic/claude-sonnet-4.6", label: "Claude Sonnet 4.6", provider: "orcarouter", cost: "12x", desc: "Latest sonnet" },
+ { value: "anthropic/claude-opus-4.7", label: "Claude Opus 4.7", provider: "orcarouter", cost: "40x", desc: "Deep reasoning" },
+ { value: "google/gemini-2.5-flash", label: "Gemini 2.5 Flash", provider: "orcarouter", cost: "2x", desc: "Smart & fast" },
+ { value: "google/gemini-2.5-pro", label: "Gemini 2.5 Pro", provider: "orcarouter", cost: "4x", desc: "Deep reasoning" },
+ { value: "deepseek/deepseek-chat", label: "DeepSeek Chat", provider: "orcarouter", cost: "0.5x", desc: "Via OrcaRouter" },
+ { value: "deepseek/deepseek-reasoner", label: "DeepSeek Reasoner", provider: "orcarouter", cost: "1.5x", desc: "Reasoning model" },
+ { value: "grok/grok-4-fast-reasoning", label: "Grok 4 Fast", provider: "orcarouter", cost: "5x", desc: "Fast reasoning" },
+ { value: "orcarouter/auto", label: "OrcaRouter Auto", provider: "orcarouter", cost: "0x", desc: "Auto-pick cheapest" },
]
export const MODELS: ModelEntry[] = [
@@ -608,6 +627,6 @@ export function formatModelChange(p: ModelProvider, m?: string): string {
p === "concentrateai" ? "ConcentrateAI" :
p === "google" ? "Gemini" :
p === "nvidia" ? "NVIDIA" : p === "minimax" ? "MiniMax" :
- p === "mergedev" ? "Merge Dev" : "OpenRouter"
+ p === "mergedev" ? "Merge Dev" : p === "orcarouter" ? "OrcaRouter" : "OpenRouter"
return `${label}${m ? ` · ${m}` : ""}`
}
diff --git a/apps/supercode-cli/server/src/config/orcarouter.config.ts b/apps/supercode-cli/server/src/config/orcarouter.config.ts
new file mode 100644
index 0000000..7b8c3d8
--- /dev/null
+++ b/apps/supercode-cli/server/src/config/orcarouter.config.ts
@@ -0,0 +1,6 @@
+export const orcarouterConfig = {
+ get apiKey() { return process.env.ORCAROUTER_API_KEY || "" },
+ get model() { return process.env.ORCAROUTER_MODEL || "openai/gpt-4o-mini" },
+ baseUrl: "https://api.orcarouter.ai/v1",
+ get maxTokens() { return Number(process.env.ORCAROUTER_MAX_TOKENS) || 128000 },
+}
diff --git a/apps/supercode-cli/server/src/lib/cli-config.ts b/apps/supercode-cli/server/src/lib/cli-config.ts
index 28dc5a5..2cc2985 100644
--- a/apps/supercode-cli/server/src/lib/cli-config.ts
+++ b/apps/supercode-cli/server/src/lib/cli-config.ts
@@ -63,6 +63,7 @@ const API_KEY_ENV_MAP: Record = {
nvidia: "NVIDIA_API_KEY",
concentrateai: "CONCENTRATEAI_API_KEY",
mergedev: "MERGE_DEV_API_KEY",
+ orcarouter: "ORCAROUTER_API_KEY",
}
export function getProviderApiKeys(): Partial> {
@@ -103,6 +104,7 @@ const BYOK_ENV_OVERRIDES: Partial = {
"anthropic/claude-opus-4-8": { inputPrice: 5.00, outputPrice: 25.00, cachedPrice: 0.50 },
"anthropic/claude-opus-4-7": { inputPrice: 5.00, outputPrice: 25.00, cachedPrice: 0.50 },
"openai/gpt-5.5": { inputPrice: 5.00, outputPrice: 30.00, cachedPrice: 0.50 },
+ "anthropic/claude-sonnet-4.6": { inputPrice: 3.00, outputPrice: 15.00, cachedPrice: 0.30 },
+ "anthropic/claude-opus-4.7": { inputPrice: 5.00, outputPrice: 25.00, cachedPrice: 0.50 },
+ "deepseek/deepseek-chat": { inputPrice: 0.15, outputPrice: 0.60, cachedPrice: 0 },
+ "deepseek/deepseek-reasoner": { inputPrice: 0.50, outputPrice: 2.00, cachedPrice: 0 },
+ "grok/grok-4-fast-reasoning": { inputPrice: 1.00, outputPrice: 5.00, cachedPrice: 0 },
+ "orcarouter/auto": { inputPrice: 0, outputPrice: 0, cachedPrice: 0 },
}
export function computeCost(model: string, inputTokens: number, outputTokens: number, cachedInputTokens: number): number {
@@ -58,6 +64,7 @@ export function getProviderDisplayNameFromRaw(raw: string): string {
nvidia: "NVIDIA",
minimax: "MiniMax",
mergedev: "Merge Dev",
+ orcarouter: "OrcaRouter",
}
return map[raw] ?? raw
}
@@ -69,6 +76,7 @@ export const PROVIDER_COLORS: Record = {
nvidia: "#75e02e",
minimax: "#06b6d4",
mergedev: "#f59e0b",
+ orcarouter: "#2563eb",
other: "#6b7280",
}
From 40c6a1718c29d6f79cf4005352bb71ae14f8e52e Mon Sep 17 00:00:00 2001
From: Yash Dewasthale
Date: Sun, 19 Jul 2026 22:36:42 +0530
Subject: [PATCH 2/4] update partnership page
---
apps/web/data/partnerships.ts | 54 +++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/apps/web/data/partnerships.ts b/apps/web/data/partnerships.ts
index 50b3b6d..a720319 100644
--- a/apps/web/data/partnerships.ts
+++ b/apps/web/data/partnerships.ts
@@ -40,4 +40,58 @@ export const partners: Partner[] = [
{ text: "Users get reliable, low-latency code generation with automatic failover across multiple LLM providers", metric: "99.9% uptime" },
],
},
+ {
+ slug: "mergedev",
+ name: "Merge",
+ logo: "MD",
+ description:
+ "Supercode's AI coding agents connect to 200+ developer tools through Merge's Agent Handler, giving AI governed access to the entire development workflow.",
+ tagline: "Connective infrastructure for production AI",
+ stat: { value: "200+", label: "Integrations available through Merge's Unified API" },
+ quote: {
+ text: "Supercode's AI agents needed to interact with the same tools developers use every day — GitHub, Jira, Linear, Slack. Merge's Agent Handler gave us governed, authenticated access to hundreds of integrations out of the box. It's the infrastructure layer that makes AI-assisted development actually practical.",
+ author: "Yash Dewasthale",
+ role: "Founder, Supercode",
+ },
+ challenge: [
+ "For Supercode's AI coding agents to be truly useful, they needed to interact with the tools developers already use — opening PRs on GitHub, creating tickets in Linear or Jira, posting updates in Slack, managing deployments on Vercel. Building and maintaining individual integrations for every tool would have been a massive, ongoing engineering effort.",
+ "Each integration required OAuth flows, API versioning, rate limit handling, pagination, error handling, and ongoing maintenance as APIs evolved. What Supercode needed was a unified connectivity layer that abstracted away the complexity of individual tool integrations — so agents could focus on being helpful, not on plumbing.",
+ ],
+ solution: [
+ "Supercode integrated Merge's Agent Handler and Unified API as the connectivity backbone for AI agent tool access. Merge handles authentication, rate limiting, pagination, and API versioning across 200+ developer tools — all behind a single, consistent API. Supercode agents can now read issues, create PRs, review code, post messages, and trigger deployments across any supported tool without handling a single integration detail.",
+ "In turn, Merge adopted Supercode across their engineering organization to accelerate development of their integration platform. Merge engineers use Supercode to rapidly prototype new connectors, generate integration test suites for third-party APIs, and maintain code quality as their connector catalog grows. Each company builds what the other needs — Merge owns the connectivity infrastructure, Supercode owns the AI agent experience.",
+ ],
+ results: [
+ { text: "Supercode agents access 200+ developer tools through a single integration, not 200 individual ones", metric: "One integration" },
+ { text: "Merge's engineering team ships new connectors 2x faster using Supercode for development", metric: "2x faster connectors" },
+ { text: "Users get governed, authenticated agent actions with full audit trails — no security compromises", metric: "Full audit trail" },
+ ],
+ },
+ {
+ slug: "dodopayments",
+ name: "Dodo Payments",
+ logo: "DP",
+ description:
+ "Supercode uses Dodo Payments for subscription billing — powering checkout, recurring payments, and license fulfillment for Pro and Ultra tiers.",
+ tagline: "Developer-friendly payment infrastructure for digital products",
+ stat: { value: "<$1M", label: "Processed in subscription revenue through Dodo Payments" },
+ quote: {
+ text: "We needed a payment stack that just worked — subscriptions, licensing, global tax compliance — without building a fintech company inside a dev tool company. Dodo Payments gave us a single API for checkout, recurring billing, and webhook-driven license fulfillment. It turned a months-long project into a weekend integration.",
+ author: "Yash Dewasthale",
+ role: "Founder, Supercode",
+ },
+ challenge: [
+ "Supercode needed to monetize its Pro and Ultra tiers with subscription billing — but payment infrastructure is a project that never ends. Beyond basic checkout, there were recurring billing cycles, dunning management, license key generation and validation, global tax compliance (VAT, GST, sales tax), multi-currency support, and customer portal access for users to manage their own subscriptions.",
+ "Building this in-house would have diverted months of engineering time away from Supercode's core AI product. What was needed was a payment partner that understood SaaS billing for developer tools — with a clean API, webhook-driven architecture, and built-in compliance for selling software globally.",
+ ],
+ solution: [
+ "Supercode integrated Dodo Payments as its billing infrastructure. Dodo's Checkout Sessions handle one-time and subscription purchases with a hosted, localized checkout experience. Webhooks drive the entire post-payment workflow — on `payment.succeeded`, Supercode generates and delivers license keys; on `subscription.renewed`, it extends access; on `subscription.cancelled`, it gracefully degrades the tier. Dodo's Better-Auth plugin ties user authentication to subscription status seamlessly.",
+ "Dodo Payments' engineering team adopted Supercode to accelerate development of their SDKs, API clients, and integration examples. Their developers use Supercode to rapidly generate idiomatic SDK code across Node.js, Python, Go, and PHP — ensuring every language client stays in sync with API changes. It's a partnership where Supercode handles the AI, Dodo handles the payments, and both teams ship faster because of each other.",
+ ],
+ results: [
+ { text: "Supercode launched subscription billing in days instead of months with Dodo's checkout sessions and webhooks", metric: "Days to launch" },
+ { text: "Automatic VAT, GST, and sales tax handling for global customers — zero compliance overhead", metric: "Global compliance" },
+ { text: "Dodo Payments ships SDK updates 3x faster across 4 languages using Supercode for code generation", metric: "3x faster SDKs" },
+ ],
+ },
]
From 91fcb29dc0f431a96104d711c5266d821771f2aa Mon Sep 17 00:00:00 2001
From: Yash Dewasthale
Date: Sun, 19 Jul 2026 23:47:11 +0530
Subject: [PATCH 3/4] feat: update OrcaRouter models in BYOK_MODELS array: -
Replaced outdated models with new entries for Claude Opus and Sonnet series.
- Added additional models from Grok, DeepSeek, and Kimi, enhancing the
variety of options available. - Removed cost details for clarity and
consistency across model entries.
---
apps/supercode-cli/server/package.json | 2 +-
.../src/cli/commands/slashCommands/model.ts | 33 ++++++++++++-------
2 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/apps/supercode-cli/server/package.json b/apps/supercode-cli/server/package.json
index 4ab51c1..5ce2ab7 100644
--- a/apps/supercode-cli/server/package.json
+++ b/apps/supercode-cli/server/package.json
@@ -1,6 +1,6 @@
{
"name": "supercode-cli",
- "version": "0.1.78",
+ "version": "0.1.79",
"description": "AI-powered coding agent CLI",
"main": "dist/main.js",
"bin": {
diff --git a/apps/supercode-cli/server/src/cli/commands/slashCommands/model.ts b/apps/supercode-cli/server/src/cli/commands/slashCommands/model.ts
index 9113257..94f24c9 100644
--- a/apps/supercode-cli/server/src/cli/commands/slashCommands/model.ts
+++ b/apps/supercode-cli/server/src/cli/commands/slashCommands/model.ts
@@ -170,18 +170,27 @@ export const BYOK_MODELS: ModelEntry[] = [
// ── OrcaRouter ──────────────────────────────────────────────
{ value: SECTION_ORCAROUTER, label: "OrcaRouter", provider: "orcarouter", cost: "", desc: "" },
- { value: "openai/gpt-4o-mini", label: "GPT-4o Mini", provider: "orcarouter", cost: "0.5x", desc: "Cheap & fast" },
- { value: "openai/gpt-4o", label: "GPT-4o", provider: "orcarouter", cost: "4x", desc: "OpenAI flagship" },
- { value: "openai/gpt-4.1", label: "GPT-4.1", provider: "orcarouter", cost: "3x", desc: "Latest GPT" },
- { value: "openai/o3-mini", label: "o3-mini", provider: "orcarouter", cost: "3x", desc: "Reasoning mini" },
- { value: "openai/o4-mini", label: "o4-mini", provider: "orcarouter", cost: "3x", desc: "Reasoning v4 mini" },
- { value: "anthropic/claude-sonnet-4.6", label: "Claude Sonnet 4.6", provider: "orcarouter", cost: "12x", desc: "Latest sonnet" },
- { value: "anthropic/claude-opus-4.7", label: "Claude Opus 4.7", provider: "orcarouter", cost: "40x", desc: "Deep reasoning" },
- { value: "google/gemini-2.5-flash", label: "Gemini 2.5 Flash", provider: "orcarouter", cost: "2x", desc: "Smart & fast" },
- { value: "google/gemini-2.5-pro", label: "Gemini 2.5 Pro", provider: "orcarouter", cost: "4x", desc: "Deep reasoning" },
- { value: "deepseek/deepseek-chat", label: "DeepSeek Chat", provider: "orcarouter", cost: "0.5x", desc: "Via OrcaRouter" },
- { value: "deepseek/deepseek-reasoner", label: "DeepSeek Reasoner", provider: "orcarouter", cost: "1.5x", desc: "Reasoning model" },
- { value: "grok/grok-4-fast-reasoning", label: "Grok 4 Fast", provider: "orcarouter", cost: "5x", desc: "Fast reasoning" },
+ { value: "anthropic/claude-opus-4.8", label: "Claude Opus 4.8", provider: "orcarouter", cost: "", desc: "Deep reasoning" },
+ { value: "anthropic/claude-opus-4", label: "Claude Opus 4", provider: "orcarouter", cost: "", desc: "Top-tier reasoning" },
+ { value: "anthropic/claude-sonnet-4.5", label: "Claude Sonnet 4.5", provider: "orcarouter", cost: "", desc: "Latest sonnet" },
+ { value: "anthropic/claude-sonnet-4", label: "Claude Sonnet 4", provider: "orcarouter", cost: "", desc: "Balanced" },
+ { value: "anthropic/claude-3.5-haiku", label: "Claude 3.5 Haiku", provider: "orcarouter", cost: "", desc: "Fast & cheap" },
+ { value: "openai/gpt-4o", label: "GPT-4o", provider: "orcarouter", cost: "", desc: "OpenAI flagship" },
+ { value: "openai/gpt-4o-mini", label: "GPT-4o Mini", provider: "orcarouter", cost: "", desc: "Cheap & fast" },
+ { value: "openai/gpt-4.1", label: "GPT-4.1", provider: "orcarouter", cost: "", desc: "Latest GPT" },
+ { value: "openai/o3-mini", label: "o3-mini", provider: "orcarouter", cost: "", desc: "Reasoning mini" },
+ { value: "openai/o4-mini", label: "o4-mini", provider: "orcarouter", cost: "", desc: "Reasoning v4 mini" },
+ { value: "grok/grok-4.5", label: "Grok 4.5", provider: "orcarouter", cost: "", desc: "xAI latest" },
+ { value: "grok/grok-3", label: "Grok 3", provider: "orcarouter", cost: "", desc: "xAI flagship" },
+ { value: "grok/grok-3-mini", label: "Grok 3 Mini", provider: "orcarouter", cost: "", desc: "Compact Grok" },
+ { value: "deepseek/deepseek-chat", label: "DeepSeek Chat", provider: "orcarouter", cost: "", desc: "Fast & capable" },
+ { value: "deepseek/deepseek-v3", label: "DeepSeek V3", provider: "orcarouter", cost: "", desc: "DeepSeek flagship" },
+ { value: "deepseek/deepseek-reasoner", label: "DeepSeek Reasoner", provider: "orcarouter", cost: "", desc: "Reasoning model" },
+ { value: "meta-llama/llama-4-maverick", label: "Llama 4 Maverick", provider: "orcarouter", cost: "", desc: "Latest Llama" },
+ { value: "z-ai/glm-5.2", label: "GLM 5.2", provider: "orcarouter", cost: "", desc: "Latest GLM" },
+ { value: "kimi/kimi-k3", label: "Kimi K3", provider: "orcarouter", cost: "", desc: "Moonshot latest" },
+ { value: "kimi/kimi-k2.6", label: "Kimi K2.6", provider: "orcarouter", cost: "", desc: "Long context" },
+ { value: "minimax/minimax-m3", label: "MiniMax M3", provider: "orcarouter", cost: "", desc: "Fast & smart" },
{ value: "orcarouter/auto", label: "OrcaRouter Auto", provider: "orcarouter", cost: "0x", desc: "Auto-pick cheapest" },
]
From da50dc9f2bcd00934c825518e297639d913d3b03 Mon Sep 17 00:00:00 2001
From: Yash Dewasthale
Date: Mon, 20 Jul 2026 12:47:33 +0530
Subject: [PATCH 4/4] feat: update dependencies and add NotFound page: - Bumped
supercode-cli version to 0.1.79. - Added react-tweet dependency for
displaying tweets. - Introduced a new NotFound page for better user
experience on 404 errors. - Updated partnerships section to include new
partner details and logos.
---
.../(pages)/partnerships/[company]/page.tsx | 33 ++++++-
apps/web/app/(pages)/partnerships/page.tsx | 4 +-
apps/web/app/not-found.tsx | 88 ++++++++++++++++++
apps/web/components/homepage/hero.tsx | 2 +-
.../homepage/partnerships-section.tsx | 6 +-
apps/web/data/partnerships.ts | 52 +++++++++--
apps/web/package.json | 1 +
apps/web/public/ddp-logo.png | Bin 0 -> 3702 bytes
apps/web/public/mergedev.jpeg | Bin 0 -> 9683 bytes
apps/web/public/orcarouter-logo.jpg | Bin 0 -> 24875 bytes
bun.lock | 7 +-
11 files changed, 175 insertions(+), 18 deletions(-)
create mode 100644 apps/web/app/not-found.tsx
create mode 100644 apps/web/public/ddp-logo.png
create mode 100644 apps/web/public/mergedev.jpeg
create mode 100644 apps/web/public/orcarouter-logo.jpg
diff --git a/apps/web/app/(pages)/partnerships/[company]/page.tsx b/apps/web/app/(pages)/partnerships/[company]/page.tsx
index 90988d6..27e3c35 100644
--- a/apps/web/app/(pages)/partnerships/[company]/page.tsx
+++ b/apps/web/app/(pages)/partnerships/[company]/page.tsx
@@ -1,6 +1,8 @@
import type { Metadata } from "next"
import Link from "next/link"
import { notFound } from "next/navigation"
+import { Suspense } from "react"
+import { Tweet } from "react-tweet"
import { ArrowLeft, ArrowUpRight, Quote } from "lucide-react"
import Navbar from "@/components/homepage/navbar"
import Footer from "@/components/homepage/footer"
@@ -62,16 +64,24 @@ export default async function PartnershipDetailPage({ params }: Props) {
{/* Hero */}
-
+
{partner.logoSrc ? (
-

+

) : (
partner.logo
)}
{partner.tagline}
@@ -126,6 +136,20 @@ export default async function PartnershipDetailPage({ params }: Props) {
+ {/* Tweet */}
+ {partner.tweetId && (
+
+
+ $ Public Launch
+
+ Loading tweet... }>
+
+
+
+
+
+ )}
+
{/* Results */}
@@ -154,8 +178,7 @@ export default async function PartnershipDetailPage({ params }: Props) {
Ready to ship faster?
diff --git a/apps/web/app/(pages)/partnerships/page.tsx b/apps/web/app/(pages)/partnerships/page.tsx
index 835f7b8..3ec11ff 100644
--- a/apps/web/app/(pages)/partnerships/page.tsx
+++ b/apps/web/app/(pages)/partnerships/page.tsx
@@ -51,9 +51,9 @@ export default function PartnershipsPage() {
className="group relative border border-border rounded-lg p-8 hover:border-primary/40 transition-colors duration-200 bg-card/50 hover:bg-card/80"
>
-
+
{partner.logoSrc ? (
-

+

) : (
partner.logo
)}
diff --git a/apps/web/app/not-found.tsx b/apps/web/app/not-found.tsx
new file mode 100644
index 0000000..2a35b1f
--- /dev/null
+++ b/apps/web/app/not-found.tsx
@@ -0,0 +1,88 @@
+"use client"
+
+import React, { useState, useEffect } from "react"
+import Link from "next/link"
+import { usePathname } from "next/navigation"
+import { motion } from "framer-motion"
+import Navbar from "@/components/homepage/navbar"
+import Footer from "@/components/homepage/footer"
+
+const EASE = [0.23, 1, 0.32, 1] as const
+
+export default function NotFound() {
+ const pathname = usePathname()
+ const [showCursor, setShowCursor] = useState(true)
+ const [showHome, setShowHome] = useState(false)
+
+ useEffect(() => {
+ const cursor = setInterval(() => setShowCursor((c) => !c), 530)
+ const home = setTimeout(() => setShowHome(true), 800)
+ return () => {
+ clearInterval(cursor)
+ clearTimeout(home)
+ }
+ }, [])
+
+ return (
+
+
+
+
+
+
+
+
+
+ $ Error 404
+
+
+
+
+ $
+ find --path="{pathname}"
+
+
+ $
+
+ error: no resource at "
+ {pathname}
+ "
+
+
+
+ $
+ cd
+
+
+
+
+
+
+
+ →
+
+
+ Return to home
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/web/components/homepage/hero.tsx b/apps/web/components/homepage/hero.tsx
index eb37dfe..c3e7924 100644
--- a/apps/web/components/homepage/hero.tsx
+++ b/apps/web/components/homepage/hero.tsx
@@ -45,7 +45,7 @@ const HeroSection = () => {
{/* Version tag */}
- v0.1.77-beta
+ v0.1.77-beta live
diff --git a/apps/web/components/homepage/partnerships-section.tsx b/apps/web/components/homepage/partnerships-section.tsx
index 31684d5..3ed5c65 100644
--- a/apps/web/components/homepage/partnerships-section.tsx
+++ b/apps/web/components/homepage/partnerships-section.tsx
@@ -17,7 +17,7 @@ const PartnershipsSection = () => {
$ Partnerships
- Real teams shipping with Supercode
+ Built together
{
href={`/partnerships/${partner.slug}`}
className="group border text-[#A1A1AA] border-border rounded-lg p-6 hover:border-primary/40 transition-colors duration-200 bg-card/30 hover:bg-card/60"
>
-
+
{partner.logoSrc ? (
-

+

) : (
partner.logo
)}
diff --git a/apps/web/data/partnerships.ts b/apps/web/data/partnerships.ts
index a720319..6290d56 100644
--- a/apps/web/data/partnerships.ts
+++ b/apps/web/data/partnerships.ts
@@ -1,6 +1,8 @@
export interface Partner {
slug: string
name: string
+ website: string
+ tweetId?: string
logo: string
logoSrc?: string
tagline: string
@@ -14,8 +16,10 @@ export interface Partner {
export const partners: Partner[] = [
{
+ tweetId: "2074153899997745276",
slug: "concentrateai",
name: "Concentrate AI",
+ website: "https://concentrate.ai",
logo: "CA",
logoSrc: "/concentrate-ai-black-symbol.svg",
description: "A strategic partnership bringing together Supercode's AI code generation with Concentrate AI's LLM API gateway infrastructure.",
@@ -32,18 +36,21 @@ export const partners: Partner[] = [
],
solution: [
"Supercode partnered with Concentrate AI to integrate their enterprise-grade LLM API gateway as the backbone of Supercode's AI infrastructure. Concentrate AI's gateway handles request routing across multiple LLM providers (OpenAI, Anthropic, Groq), automatic failover, token usage optimization, and real-time cost tracking — all abstracted behind a single, unified API.",
- "In return, Concentrate AI adopted Supercode across their own engineering team to accelerate development of their gateway platform. Their engineers use Supercode to rapidly prototype new routing logic, generate integration tests for provider APIs, and maintain consistent code quality across their growing codebase. It's a true partnership — each company empowers the other's core product.",
+ "This partnership means Concentrate AI's gateway infrastructure powers Supercode's AI requests, while Concentrate AI benefits from close collaboration on the gateway features their LLM-forward customers need most. It's a true partnership — each company empowers the other's core product.",
],
results: [
{ text: "Supercode achieved enterprise-grade LLM infrastructure without building it in-house, powered by Concentrate AI's gateway", metric: "Zero-infra AI" },
- { text: "Concentrate AI's engineering team ships gateway features 3x faster using Supercode for development", metric: "3x faster shipping" },
+ { text: "Tight collaboration with Concentrate AI ensures our gateway integration stays ahead of LLM API changes", metric: "Always in sync" },
{ text: "Users get reliable, low-latency code generation with automatic failover across multiple LLM providers", metric: "99.9% uptime" },
],
},
{
+ tweetId: "",
slug: "mergedev",
name: "Merge",
+ website: "https://merge.dev",
logo: "MD",
+ logoSrc: "/mergedev.jpeg",
description:
"Supercode's AI coding agents connect to 200+ developer tools through Merge's Agent Handler, giving AI governed access to the entire development workflow.",
tagline: "Connective infrastructure for production AI",
@@ -59,18 +66,21 @@ export const partners: Partner[] = [
],
solution: [
"Supercode integrated Merge's Agent Handler and Unified API as the connectivity backbone for AI agent tool access. Merge handles authentication, rate limiting, pagination, and API versioning across 200+ developer tools — all behind a single, consistent API. Supercode agents can now read issues, create PRs, review code, post messages, and trigger deployments across any supported tool without handling a single integration detail.",
- "In turn, Merge adopted Supercode across their engineering organization to accelerate development of their integration platform. Merge engineers use Supercode to rapidly prototype new connectors, generate integration test suites for third-party APIs, and maintain code quality as their connector catalog grows. Each company builds what the other needs — Merge owns the connectivity infrastructure, Supercode owns the AI agent experience.",
+ "This partnership means Supercode agents natively support Merge's 200+ integrations out of the box, while Merge gains deep insight into how AI coding agents consume their API — driving improvements that benefit their entire ecosystem. Each company builds what the other needs — Merge owns the connectivity infrastructure, Supercode owns the AI agent experience.",
],
results: [
{ text: "Supercode agents access 200+ developer tools through a single integration, not 200 individual ones", metric: "One integration" },
- { text: "Merge's engineering team ships new connectors 2x faster using Supercode for development", metric: "2x faster connectors" },
+ { text: "Deep integration with Merge's Unified API removes the need to build and maintain individual tool connectors", metric: "Zero connector maintenance" },
{ text: "Users get governed, authenticated agent actions with full audit trails — no security compromises", metric: "Full audit trail" },
],
},
{
+ tweetId: "",
slug: "dodopayments",
name: "Dodo Payments",
+ website: "https://dodopayments.com",
logo: "DP",
+ logoSrc: "/ddp-logo.png",
description:
"Supercode uses Dodo Payments for subscription billing — powering checkout, recurring payments, and license fulfillment for Pro and Ultra tiers.",
tagline: "Developer-friendly payment infrastructure for digital products",
@@ -86,12 +96,42 @@ export const partners: Partner[] = [
],
solution: [
"Supercode integrated Dodo Payments as its billing infrastructure. Dodo's Checkout Sessions handle one-time and subscription purchases with a hosted, localized checkout experience. Webhooks drive the entire post-payment workflow — on `payment.succeeded`, Supercode generates and delivers license keys; on `subscription.renewed`, it extends access; on `subscription.cancelled`, it gracefully degrades the tier. Dodo's Better-Auth plugin ties user authentication to subscription status seamlessly.",
- "Dodo Payments' engineering team adopted Supercode to accelerate development of their SDKs, API clients, and integration examples. Their developers use Supercode to rapidly generate idiomatic SDK code across Node.js, Python, Go, and PHP — ensuring every language client stays in sync with API changes. It's a partnership where Supercode handles the AI, Dodo handles the payments, and both teams ship faster because of each other.",
+ "This partnership means Dodo Payments handles all the payment complexity — checkout, recurring billing, tax compliance — while Supercode focuses on AI. Dodo benefits from being the payment backbone for a fast-growing AI dev tool, and their team gets direct feedback on what AI-native SaaS businesses need from their payment infrastructure. It's a partnership where Supercode handles the AI, Dodo handles the payments, and both teams win.",
],
results: [
{ text: "Supercode launched subscription billing in days instead of months with Dodo's checkout sessions and webhooks", metric: "Days to launch" },
{ text: "Automatic VAT, GST, and sales tax handling for global customers — zero compliance overhead", metric: "Global compliance" },
- { text: "Dodo Payments ships SDK updates 3x faster across 4 languages using Supercode for code generation", metric: "3x faster SDKs" },
+ { text: "Seamless webhook-driven billing flow — from checkout to license key delivery to subscription management", metric: "End-to-end billing" },
+ ],
+ },
+ {
+ tweetId: "",
+ slug: "orcarouter",
+ name: "OrcaRouter",
+ website: "https://orcarouter.ai",
+ logo: "OR",
+ logoSrc: "/orcarouter-logo.jpg",
+ description:
+ "Supercode integrates OrcaRouter's intelligent LLM routing to deliver users the best model for every task — balancing speed, cost, and capability automatically.",
+ tagline: "Intelligent routing for the AI-powered developer",
+ stat: { value: "50+", label: "Models available through OrcaRouter's routing layer" },
+ quote: {
+ text: "Not every coding task needs the same model. Simple edits should go through a cheap, fast model — complex reasoning deserves the best. OrcaRouter's intelligent routing lets Supercode automatically match each user request to the optimal model, giving users the best experience without manual model selection.",
+ author: "Yash Dewasthale",
+ role: "Founder, Supercode",
+ },
+ challenge: [
+ "Supercode's AI coding agents support a wide range of tasks — from quick code completions and inline edits to deep architectural reasoning and multi-file refactors. Each type of task has different requirements: simple completions need low latency and low cost, while complex reasoning tasks need the most capable models available. Asking users to manually pick the right model for each task creates friction and leads to suboptimal choices — too expensive for simple tasks, or not capable enough for hard ones.",
+ "What Supercode needed was an intelligent routing layer that could automatically dispatch each request to the optimal model based on the task's complexity, the user's latency expectations, and cost considerations — without the user ever needing to think about which model is running underneath.",
+ ],
+ solution: [
+ "Supercode integrated OrcaRouter as its intelligent model routing layer. OrcaRouter evaluates each incoming request and routes it to the most appropriate model across a portfolio of 50+ models from OpenAI, Anthropic, Google, Meta, DeepSeek, and more. Simple code completions go through fast, economical models; complex refactoring and architectural tasks are routed to the most capable reasoning models — all automatically, with zero user configuration.",
+ "This partnership means OrcaRouter's intelligent routing becomes the brain behind Supercode's model selection — automatically dispatching each request to the optimal model. OrcaRouter gains a demanding AI coding use case that pushes their routing algorithms to handle diverse task types, from quick completions to deep reasoning. It's a mutually reinforcing partnership — Supercode provides the AI agent experience, OrcaRouter provides the intelligence layer that makes it work optimally for every task.",
+ ],
+ results: [
+ { text: "Users get optimal model selection automatically — fast models for simple tasks, capable models for complex ones", metric: "Auto-optimized" },
+ { text: "OrcaRouter handles model routing so Supercode never has to — automatic selection based on task complexity and cost", metric: "Routing handled" },
+ { text: "Cost-efficient AI assistance with intelligent routing that matches model capability to task complexity", metric: "Smart cost allocation" },
],
},
]
diff --git a/apps/web/package.json b/apps/web/package.json
index 04047d9..577f93e 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -78,6 +78,7 @@
"react-hook-form": "^7.70.0",
"react-resizable-panels": "^4.2.0",
"react-simple-maps": "^3.0.0",
+ "react-tweet": "^3.3.1",
"recharts": "2.15.4",
"resend": "^6.14.0",
"sonner": "^2.0.7",
diff --git a/apps/web/public/ddp-logo.png b/apps/web/public/ddp-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..f97fb338c71abb83ea983937623bbbe061bcd339
GIT binary patch
literal 3702
zcmV-+4vF!JP)
Dhq^-&WviBf|PQWbDqz-_?Z$JqCThMaE@5NkTk3w@+diGn4}rW<;``J
z%V$Y+=S7CFi$Wabj2%!8c95Kb<)si;c`ldV%?br_7-vPkC%s{k@`PK$Hlif>o~|Fq
z$w8bF8CLs(#0lk!PZ}6k)1bf^O-SOGT(WK_L`F2M!rvnq7Iy_|{2nLH&$}RYsv@_6
z<+j8Hu~QLwHHce7fiW82&F0Qi3M4MFa?OKMiYt_C`r`@(W!k3(*pCyGAc=`wDqM(j
zs?2nfRyj$#@I*vj<<{E><-++fC3K!F!^tw!viF=4c#=8-*W#gF&^}}tYnJT0XDM%F
zqnMF4Y=SX%%9i`KA~N#cj`eB-_r1@C(8k^Ml=OBADehB8U|oE}__u05GK^7?|0TU6
zObNV7a$g&GuT}e@9mycZ+%-N}QHpWuV1yjwM}N->SIGcIMD7S|2U9}F7P%v^T}%ia
zOJoFDtQ2H*ut*o`?2N-sQCO!U
z?yzgWyC^gQZo(r2JbfZ);hFURf$oirHgDmyVdI-Vx2S&iAN9OP4~zcqx6l-tFbI
zN&Um$Ztu&{D#KeU>2WH|lS5f@X$^F=bP3{o_w6hCL5Vec_ZNCPCmKF?Q(3q`SRMNI
zcG317Iodt+Hub-!(RVXUShpQcWYPPWG_Cl-KVQ?ei%az2?rTaKc!YtWw`l*NHSI2V
zD7W1*x-Lg^9%%qKd}HioDgpy|fjie<(diF86ta!@$R9*3tgMZ&RBwudI1%Giz>P$?<|MH0-ArRl^=izhTkIzBs-}BYXds
zdWSPiPb+I~Xvt+OeoQf#zV!=@oqg_Pqkei}Jsmv0hT4RA6@=|-v~;M6C5yU8gRxb&$_EP8%`&%IOo;0lqaHQHW9uUc5TtS6U4Pl~x$q1Sy1KlYIhZ_HyP%fuY8gxbue=vYSKu$6>vpBJ!m4dQ6PP_in|nQ*TpN*1y;8>=9D0
zbJsV}$7kz%3w#HZK;f0LC$=1{Ui4RK$u&jgs(JjVGHlAyj1P~mC0(!(0clgPh#+hv
z{?VDW{@*|%FTnkyn7?By#9uAo*w+X84DSDSn3h_^I{Pv7LMb7MP!y^
z2c&@xYhrq_Ps55~WuwZq*1j*sURY@uv4=<2&~6n~H;caUK04p6RIn*^hV47LeD9>w
z`QpMDtL%=fbT?H1!A^)++a|I4VvG>J3dJsP%MY%F8t)h7R?(dghG#q#90TKRi
zaow`l2uh|X@=V>1H%8;NkjCL(u!1G5$I-;YxQtZFf916?EjYkL+OerOyw!!NV%@tP
z&l=xYUa9IfYOqietYAS+;fs+)<1=Wi4u3ewAGbj_H!>zK7;rP+Ys>`?tNL=Y@+7R-cF~9kHy$5kj8p7zv`wUZ%nF00aw*A
z+7hN3cKVina8sS?*r+OnN!M(FO52Ug(cWJTejZoTiyj$5C;e##(h1il1=89L67Y>0
zDx$QBEEan>6FFmJvMCFK%SENi6@sc)n#5@nE=f2iGC;oQiZz=k*O~xrq77r7(ZS2)
zK4J9SuP-DU%{Jl(M^=dhOOAChDl%q}OwOaC=gy`)7J>zb;)5u8v+*$Ww>!+%cK>3b
zaIcF?K_C`K=we*tZ9B{!?GTjs+H5CcWTJF9u0pQ@8N|j!c-lf|c~^xRJm;-gvW@jk
zfzY!l9Z!)}q?GfV70Ku&Vo_!^JuU|XMSIM-CTZ2(85Wu6as}R%D_sTLBv=$@6GYvx
z>aP+K+a-4$<+E@VkQ=|)Gj<-@c5x6FhtFU&MIiXBnnbV>3A?nL;@vHJBI7FVz7kVn
z%TJ7?(J9B%Lkm_`JBA@xBaM|K==s6HZeVlyHq6>+f0w4Jc46(cE7ARBHGR5WBZC>>
zbIcz+8I$uQ&0ZV?Q-8BV>4+Sxk$ymWL0YvdT&QyjpbO{-EQ$FCp_d{gLH|&(wnqlR
zv>z-bOIu7_&&Bl@5y~g{zua|sSV=FL
ziOL3lk5lO^lHfk5?0G7W;oaqZPu*4fpK7T-zXbn+RV6xSnbf22J-w`jbDqbo|4p#Y
zYmF2?kpQg<_AaCRt}f3jW2llER!g0^7X@wS}9bp8U4*(DB1g1nYTxV!Iwgc
z;~H4}hqYm8p>viA(Agsf5OnR~Pj=ycrCUfrH^~AB7O-;CHHK3@E&>*bP6q1?(>}WU
zwYij)IEz<3Y9;srNT*z)yPQY6K0
zHp4d(y0phx?=!1c$_Mu=BJcADXqG2SxMaa3WhQHZ*xv<
z<}?H=4DcsgYagxOO{BDH&1qJez(V;n-?oFvx@mA-kzaBCr7DXVUojG3>)cEoFlo?k
zFyeKMv#!Vpz?3y#C5xb}nC2?Tw09|*hDjRNzR(D_Y|R)KKRKJ8H9v54W-KzCpKti9
zM!)cTh2^ms#~r4XQZ1A(VbBgVvtrORKDRwKgEUjBC?^`Y2P-tQV$f9N^4M(EnvwV)
zOlg^rizgcBB310v%!)zFOdHnh_ZEx5n$rlv7Rs0X%`U94CpS0R>RByC_Dh|N9V3e%
z2>YYOlj@sc;(YGZU?S8-vP0F(a3N+X$*SANsXb`~VMwL27=R(zs=YK&BSIHOmD?V*
z?Y2<~OT%s7`8K`do1)P=*s3P9$Vs?uRKn88owF8zL5EhsRyA5v9A&p1x(7uet=!qA
zBc+;w_J($rny)!>
zKwLFadCsT;gIK1rhZSZRrcBU8@i87|8cT`Fd>6*)}fOSn=
zPBxF-)|c~(Gid{XcXt)WDJI53Nt;5iMobCpzZMy!BeWSz3hcig8D>g)JDHR>RJh<#
z2QB<;MFq2Q$KYD5Wd5Zqs>{ia&^p9RlbT^A5yc0^2e!EzqrG7Hb&Tz@A+Z1IWSOaA
z?_q0@=5)cZXhe{b?nb&xN(2?8yBnmWq`OlZ1Vl;@C42|(
z^W5ipz0dFS`Tg_0YnXl3UhBKpT4(Qb)@SWK{Fwc*0zedH6=VSr2mnBc5Ab6RG^-#Z
zW2g#$AgiE!?+-;UfFLjr0NC2OIKkzlX>@e;XwX*v7;&RBGI4gex&9YI*gc!Ru?_$e
zoc{&${}N-EnmL;w0EdV#gA>9zB3LMbhnoMvv)u5;fADv2cy|{E7X(K2hIi6{%OH4D
z1kYmr7vA_UyorO;4L%xyxod0VdgJScZX(7uv(r>ZT+tCHL3W3>g4`7YqP(Bma^8XHFc9oQ!^&10!0bCr<$2I3ECT
zbOC^H6aX+E{?s9w{}LMwLPd#)%O3GD2W$W{fCf+i>;Myh3&HUMJiu*0;Ku?W10W;a
z&`pbsATTQUhR{(_QBX0^F)=aFF)%Q(@vt$maIr8jaPV<(@gNX<2qrcGApwLC!9#A0
zfNn-2gV7NKAy^n#2mn|)ZnUqM9Hj>ayiFFu1qw$O!tjPE~{98$#<1NQhBIEaK0D#**qwIW7BjWz7
z(;SY1@Ou<&+7!8S(&RWpS|O1~^S_S8uStlNaA@_P!k(=e=%(j4G8ge@=4etiDW(g~
zLa#r1FR`~ZtAZ*lt3(cfIQ7}^eEE?je>H(#2J5Af>k7)A4)14b@GBU)QR5_Bsy;m`
zApaGL?7uy=+IWzdN%$(`r-p*@Jmc%SD&H?K5O(*G+NnXBh2$S%1gJpZ;#Uypqz9gD
zRG#;9Nw5neRT5rkP{kZRvB|sO&m!6unNGWxupi4TwZ^g=46;9#v>&+vlzPsr(m%t(FJB9L9pu006~Ya03OgwZkvY
ze!?_#(^5>yG5{cM*gEQTaq;)(jLNqQ86sPOhzXg_-0lOjM3SuJ
zZ`a8$T)0YF_rX<{}uBmFC^T>iuuS?^P$`@lK-F5
z|4RlBk*}B_h-?Nz0YG3xe)>sZ6l7F10EEP&N&_Jhki>_^5hBtTIwGloP>_BAe6zLs
zStOo@w)I>?j|E_4D7z8WZcTEJc%;QMZ(+anLusu`(Wgg3(=%7SV)`kD7m>s9+b?x@
ziNkG*Tkh+7oUA*PAD6w|k>BXzz;D9%{sVyT=&u{A4a9QYZM4>sv6d^cposHPex-e#
zNu`-0b(%2IfU+X~DiGJB&gvUc_ZxW|4(mK^o8po{FSo`;V$BdNA($)B_TEh6pj~`n
zq8ED596P7g2Mfp;!uP*Ug5~;A6{hpch&j_2+V3pyP?T;j7&bPQ?=ZY#EJ{P
zW@glHdj8OmZaliI(TCfnw#3)%!gj#AReVF>%D>on{S^v9gv&`rN{R6U?Sb!^0VC35uEX}$B=2;Fh|
zm##8#Q5h2@{qI5e)td#C=oc2snueiLU{d@`-Mny*vii4a&IcfMrqt=ReAAEEMh^+4
znBYwVG~wXDZCAP;LAwR})*Z*Gkg`M*tKFrWDcn-xaFFwSds6XWu5RI=#g9VJx=Jw%
zM(KSS;IfqS=EeNeC~A>YPJVZL8G3!c(w;KXCvN$$5~qRgUyQIJoyqOp9BBlKh8BJhEq3|SL5*1xgB&{^nL&RF`e(zeBrmB@|p*thlX8#M7+vS{9o%10Lb|H;v#Al2@pVi
zQ@h{;$iOeP3kY8lpn>qHIuQJXBHcj0srOhn@8SjGm_N3rf9wtMX7+kt{4$1w`<56A
zUWW4b;PMjL?^?c?fgZ4$$Wn&^P|gm@yeTl@8oGt=0%Pau5K741m$FFwhVc*iBMF
zlt5qr1^+eyAuXMhsv4A@hgTYI*=
z(IS3vy2Ck7AqA1$`F<-%3r=*gSfV;VgCkK>Wtq9~ir5$K!MOEdipjN7ag($Miq8B`
zH>^DubFQAAcJHKBTU80ndkly{)p>0E+b^5T{J1fR8nSZPSs6CPot?5vGN%)XLvX-q
zuivL2#aI_?am!DiQ0Ya;uygPUFfxstEVQj{aF6EdB>Ozibg7|`nx4pR;AI`(6@iyz
z2i|%x;_PSYB@)X?`JwV~ce<~1z25q;;mkm9V#&`B9C3S*vvE8yF4Kb#Hx)Wy&VSau
zl%25$56OWR=txb-(dAGLZ=JWFxw$#0O!K@*jp23S6oFerb`Vst(~a6o*HKyJEyyn^
z+ehC@v$qey)Ig`FMGGXzret~%zh&E7xh}hh&Sg}$vac}fYORHFQ>sKEW)>ePYMFAl~UB)rtk
z7DxJ2d_A28SP>W98qV?8BCc6kMP02QoN=8sS1dLZREU=>b=Va~J@}LZXqB6z5??b>
zej=TC+Z-nGAhd?R)?hiWB6TBHKj3s#9kaDF?tS~kqMV`VI;=m07LTtf@p;MOacGhC
zeB!vTCyXr@-8nquI1)9fw)aJ#~!?2U)
zo>G%~g*n9xB`Q4-ZAiZx7Gt@qIp39OiNZ{arb6;i6X%7ru)d8~`n4~mkTO}(dp!7-
zlW2{bs-S+CzL~Fy=f}^@Pj{k=^Y73+#q1a9er5pAv=EHssw*I^O}kS$(Yy0NP7W)o
zc%_Br0=;gyB@r`i5AwVsmERpZ?K_H!6YRYWTib&s?$-39QyVutVV2>8cRFP?1rL?%
zj}WVdCZb+3rraDtYazhOMhx))2A^o{MZRTG$r%+EllPz7Hs?N%B}WmX9CC0<7l>VV
zMONlZ8cj)ve|*a?S8I%16nZR`8(9X){zR*Ij``$sy@ZkhQ_9pse#2t0j|Dy(G>^d3
z6N*B}1r5GC{uzG1kUOjQ#DB;GS5Ufcw6nw{DT!+~vxZ9Cj;SPgeOm#UW={~4are6c
z{yWIfQqf@^U1{(H#+j`8w7s~UfK8o_obdbLSRZsNnW{-X-q^ybV9iCt{GES9(AHG9^o8M#hybwaKuLc8`cj9NJ*`
zGCnnSQvBV{+oIVR@fIO^nmrMgS41ZlneJ;80yM5ELxi{JajM4cqzNCN+@9FFLq(zg
zC}}jSB<9omlbEwuUqe^ShY2rj-(X|m9k+(;aC1(jOxEgou$6x;@m|+rvg34oU)MMx
z+g09K6%m2NOKK^|NI%H(oJZ*Jlw+Iw(rrvd)0U3V`}3VNq>yh3l%AblNyQJaG<{EF
zQ>~6CV(lX6C#w@)oNwyK}-1^vW+$G%u#b9g7`bL`Mb9cu&80USvGuX5;Qqk={_wHEz+>9<|Vv
zPG8ylZs=LR$G{;K-Xdb6tJl@XLk7;?bFik6D|8KK6IF
zG&yC*{jej4Y~Ku^uddoUOMc&Vsx1IV=e&VF(%!hp<#g0f;MSHF5%EL&SbMiN#*HOl
zS^2!A@~S6neBMjNmWVo&O*=$z_vpQE636#ZF69U(V1o!8w8)u7*J*@Z6T=4KKvrk{
zx~OEEp_j`t3uG1TR$AEsy(;fNx5mV_8SkER%Zqn#Rt0EAC(-7cf8btvzAR~Gvc>*A
zs-3DYKVz!$rKsvG+B?lM1}!EsJXg;ZoQuVYWB~DbJaS4bhY6Yw{^|D_P}hp2O}R$BJo(
zXKYXx?CfSew8W4m;J}ct0F^lC&zb6vd(B})TT1Be0YFLJ2kjUF`fNha$beg
zR%pkH>=?>>W<%b$+ihH8nKIw#gOxsOW>vKr67o;RjD0Rw#`0TYt+8NB>%F
z$+!C{is`CU7^rQcVJK&b)1OjU1t}I}hg%xwr7Hv@thuX7$?U1Z0xsajoKZNspwk!&
zs^qWM&X`p(R5qJCXcm0xQ_#}U^geffpRd%e*q&qhM(ur$0-l3YNBF^eyX`8Z#m3Ry
z>SoRBIeTwLbYND}0-OSKQ&o{(naNRtp||=)iPn`h%~85J8`4;J1*vb3urSaIFFcI3
z3qF4F<&(%^HDjX4e7WMpjVGl%to-f0qD>4jyT^@zWuI}hal8cV+UarZ-n#=(sxuB$A>lWmFISzB-
zAfJ|FnI-Ew>tUj#pbxr6gpFYO>~VQ~HM|)zVMiu3{rU!uFxUEUbGdr#E8biv$)H$l
zd=wd*y0|CvygLkc`bmYsr#bSwNh;nhvn5@_Ea!HQT~w6Qzhsch
ze2V+#e4KYsc_`Ivs85cyx~Xe(u@`q-gLrYXw5Ed|17iYeYQ$p_mPL&=xsuE`f_J#T
zIHrIZV5_t@H8tg}LGi`&Z4$2%`}O960|^pCbgZKkEra9Z*I3`kTeFrl@4&)S4%Sst
zMQZPY#I#?!wMEd=F9Jvz@)QxF!-AW;J|3>4rW4NdhS`8@V}A@maHx)P=K5|1V}|hKt*_;d`4O<>k2Z62O_nA=8NGR?
zqOVvtHpYvY5t?HjPPei&d|Wx?s*F||Uqx^UDnnp;C!vr6WMFx;r``Mf_Luli6^n4%
zewvYt6-MaItNG>*#CKN+qM^Qc9f#7OwUj2(@Fn~BwzX8Tejkje0-y93<*rPD
z(()_j?3`Z@aEN%$-{er&_a&j$`6}dAe)59hmh7-(w2m
zX6nbwpPGp3Cruou<1a^a<)@sa{s6kn^N1mS(KN*4(K#AliS_N=9DpJS((bC)VfJ30
zL3SdMz4j%=XqU+FhgJ1uAcBh%r}_FTNbJtHW;Ts9s(@3hhI#$OE7x<@3b*C
z_ka)^!P+JY9^C%G^MD2TzzT}16VE%h3Ma8xPTNWFh9ueA;4U*~>oZCY9Pyl07L9qF5s~sy-CI
zwdX(+D(w%n5X1igc)5&Wqlnkr9LK%Wc`>q`o-6u#D*B#O-m2>HNSDaB
zYO5FSBX5WKvq>uE+uu=%&|c?%5-ZPW8?~3Z+!k&b9;EY!H@qHq8}^%9@`8;wC-}L>
ze^14}lH#%)(kpifriC_$&z5x>JWoTWZF~#TYzuvKI9N7^D(7lYMSaeIrr1CJ?2$@Q
zY(TP`6CHzw@FwgTy+LGP^y_4ItTZB$rmVE!!UPmK6jE23Aek*AoqBo4LP5dH%+cKV
zqE7@(q*?MTooSzI4@7k16^a@cyJ9|&gs!ff1X?AMdl(vBvI}N%s0#a4F0+&b33rCF
z$HU60u~1*$qVbN^BuBj5gt{DZ$SZu>VdqC0~yKK1*&iT{k`x5*i~
zS(oJBjgN4=1uH3Bq?l3EC8#0~YsR0E)`xZ3;JpN$nC7$TXRp|;
zptcg+J5TB~utKk;)+ug2-Lftye%E7guORKheH>Tj0l+_4OMHEN
z)>alpDZNR>-A(Hh^CIgwyI9|QDdGs~jrDZAje5ur5kCu}_(MXRdm|c@KYp_Nck#!g
z>PQnH8HcF<+96|qR(_D{*VdFd0Vcd}o_LK$Ny3!~I%mVY+BRKWhDOHtLcJGki=iDh
z9dT20LM5RqGG-J{OY&oIh-`3q$;e5yo^kcZS8=wN9B7KIX~tkv2P>A_1oy8+fLndq
zmwFxJ>1gEHz`_0aYOHq_Mq4)X7{_bbLT&FA4}3FWDxt45(s8wyS;de5=On%Jv&)sX
zB@G>`x9&_InjMv$fC~@0kot4d*ueVsvvqdNinxp)b}V$+k?mB?yCYXu4eTqYeR;;a
z)V)e^p7{zKC=-t(0M%nARasQ-y;r@D#7jv8SmMK`g00W?>*d`&@CZ&`9>#s$r+P2X8XrM;d$ZBdAJ=o;c>AMawns9f)#m+@NqIHDalpJYMlq+
zS===&4J{gh(Mr1-9^3pvlEMNC{)NFX*nQ?0{9=zn7)*n^y7Sc>15XkYtP)&(pLUwK
zqlj)5%}ksnxs>5SZ%3zzF08-9L?iJICs-&W_Q{v)kyY3vMi-`wW_q{*Vep~?K0eIb
zc7lmcOD`Rr{%v8kX`g64r@(~UyBg)Whgr9=dA|{Qs|iCQ(2v%^8}iZg!&&87dcDjh
zZWUXZIEvJ%qM^Hl4rewO9L2OY8!0XM@k&XLyBCn86L|SjrUT{qrR5#x=|18I(D5=?
z!X8UAM06*zZE=Jsgf3u2cMjeveKxyM{aJB(WzqrKEUIQkQY2vU6I>yI<*h+0A4#8I
z?XOLN-EvJyIH=&34~k2mn*3m`9M&n6&_L=hUIRHJ(GqrS;~}3Fz|?&HIcN6x2k|-h?uxAArObOf}l~Lr_tiQV8{IOEj|@vD6|7|G;xC
zV+r|yK=kmr75!Sq;n#21)$WCo;YxawnOR}iHB~Wt2{!NYkP17{;Dv33x4qCoeq%U1
z0JafM3v>;~MfLSdvL>3QVq#k(bi7I{E_-Z_89O$eb+mmF=FpKzE;AWc>Ca3Deu?f_
z!R%M8P>%s9z@@~&4{DeB2PqOhl>qaa5;V^tKc
z;^#GdG^Pm+xPXVllsIc-2xCHGZiadxYD}IVu&}2VrqT1NUW1d84bWg|@
zYDLiX9AcLhZi9_xOi}WT!-$Y&H2VVkaMC*w<0I0e#ina4%zG+TP%-H$sS>rFoQ61(
zL73Hf&8)a98*87)R2}=LJ?;G?J~hP_o$$6`1;S^nRe^53wD$AFj5#k+l8Mzh8`<3t
z6HY%tXq-bFMU15$4W&(+-y9jk|w%kTFcbx2ldV8W&2!uaQ++d;sO}z`YL#eT8kX6~Fv?G#93K
zyH?2HqxOe_*3S?onyy#=T#OjE*g8mRnEO|t*Q{zNO_LF|1(ILrroweopQnXug$FJo
z{u=}UsJk7PgUOd2=;F}de|UMxc?1suFw070gR4wvU;4ovK%fc
zi((cG`wpqim;N|x7QjHhIT@j#i_|8DJbCO(nnqffq&w>ROcoEL7BKngiN&jcRF;yq
zR=y4(wUbizF(W!w){?rcrPEfpx`Je^
zamOPT8~Kc8H~}Np*h1r$)pYkoQK`2>pSQs=u8DCDOMGr{0y8$a*&K05aH~(VxXRd4
zD~243zgE)8Bg^sD$~cOnGGhWt+OKI#q*0`)X=pBcRM8e^iow7e|1KtW5X>kD*R|ou
zbwM68dS5S)3x7eRY4{}eUbt$$KZ#PkIL%dDbL@w^s`TSnG&z&tWn2GnK4rafMxp5P
z8miBN2`N(0ww@?%er$}ES5*F7sY^wyRc+@%9OX5*j?WXh{f-RSqug?MVNidY$QR<1
z5&g!&!#JZ4t2;s-jVqzDMlR5R_5+QAsS}VlY}Ddq?^k{E5b}#%>Ju#FE0L@=qObnO
zXZKi1t6Qu0qh73ZZqIUYL}1WjlS-0?Aaw_SY~^_PAE;PJ{0J2!M2@ndW;<{4echIPLpJEh}JfR4o}Bb=SJ<
zUw3xS&g{q}nM{&7ljL>rbrV397MBtSz`y_i4D|7vO0Km@P)md3Wm_$=cn*{hDU}WOrD5R(;`#*yI7kc;ejXD6#GQQFJUy=V`p9rRA
zE+(J~!h#aMH*s`!1>u4qT;9Xg@ePj$;g}|tMy4RV2!t~@gDMEZr{2Pi|G|H~;THek
z_iwnfsBW+UF93mPDIyxE(8X5-nI~)v5d@M9HTvA+oLPBCHykjDU(E>%!b
zcSXgTJTmx=9NqkPwETxuLuqP`8iIG8`|#Eqj1r1IpWrY4-1J`Kf0UVQ
zQ+t0dd-3DAb@;@sonJw~!zpcVJ#747Jwtg}SyEXxx{#tpn)JOaDNQ0!a8#W>`~I5y
z$c@YDu0{4L>e!+DgZKxd${9_1KJkx&M)BZ+ps@!DCbw?WrGZrIW1!Nzme~>JITGiv
zk9p?pGwtwxO+4(AZFxT{M?$i&V|pP?q9tZsz0#idDgXfs369NvQ2&w9ukma_ax%6EX?9Q#3SuoGpnd(ZV32J)dfLa#eEkX(@%?W8
zvDxHXZIHj?_OP0|AW}5B&sKVV*yNjPhTxa{AXkO(WL#mR2^G$oX~}tKb9)?rd~0XI
zX}ABUr1jUc1O)fICyLmf9$$O;brg@)jRWUNjmC{q4fO$rEC4$S;+;~m6kzg8*m8Eq
z?!#KkO$PqSgqP`iY3gyljY9?C{MzXJ72x*1(|+<(U%T+u6^ALbVZQ?|VwxxCHtGpn*OUOE*^t#Jr@FKL&Z`vPVMpz=?e
zj~*!>BxHtLb9-<8z*wYowu`wv`i!}z9gf*I&MbT}WtECLD$hw@Q^P##UDez;oO>
zByZmA&`1er1r3+7LBYQz8m0>i6GTWyWxlujB>(kibqKpcZlSsFwUFGNcRWYlJ|^R8uoCw7*(_lqmY?Fy!x_^iC
z4-fTNs5N{3IwS8|KJH70WfzVayt>~yg;@d<3K+dA3b3n*0T>E{+KGnUmXW$aw
zAy-N&F`x0oG5X*@;1G;qB&)6MDkK`7yYCz}b5LL^}>^e&^ftdj^wy1Ck+~
z#v216uYI?D9`{Wq7=7Q|8cRR$HAft(YfN)0aYaLl=mLz;ZU7KA1TAUM0!ZaoodYO&
z8VTNvek&(AUWMk%YjVq1OGni~*OgE57*j6S*S9z~R<|q2#B{EcIX6)9lVBbFw~yT3
z(kxCNnr!-3+;whYYjUi`p$Ho7yq)@z>Hm77E!FHTw!`{3um&Nex|-!J
z{U&rEC@EVT{OD813Gwc$ItD!g{FGO7Q9FL8W66O&apUB*k9+2iVqWHf`T@V#KAG&k
znzKLG->(T{igb2vSzL6+&`M%OU_nw-8TyIDZNawBIMVVn5wun(F`ueZFrmZXluRLP0>&Wv&J3MP%?fsj
zHnd2Xr4~Jbrgu(*AVIl-juBq%GDZHUay6-RhjhVaQ7aaGa3aV{ZWnHq>qWPRlSaNo0c*l2M>lli_WNB{7C3G1csk
zM1w;!L1l#?8$1qjr890F2LwQ>2NNnt)c}Kl0I3^qItYl^n+J&og~|$zPJ)3+%EBf@
zCa6e`MM25I2~tO3L8=NE6!;~j1wFFnKR}Q07oZF)8SKKYYX5>d_8V~Z_88D$<(7O9
z>e|Uo2@blVzj_52Liyl{$NtO&Ef!vRJX}5)(C_-b0^v{Av>{uV?|qiL7dTIEP0pQ=
z5PkFo2KgZUJv_D>X^8o}eVKwGR!t{*HiMl=2Xw;t;A^y4{<}EWLYU&-J_F$`%eXtxg
zmx=u~Hl#d-SoVln$u;pOjY9F_Y;|jFu{kg6B>bnjcwAG{%E!q!-qHMlEjl--aos)3
z?idm75jK`tTjn?JaL!_-975N)YnzMx5TJ<{r;iQ4xOCWaM9)NT+Ke*0waYoj$?#*L6hwz)Pg_I;<|c58`%d`qv3(yWK&CeQYfJMfG>ROsR3$kvC?tMiu-re|2S{i^g#%}kX$qlWai
z65LAE!ukvz(_OY+)9$bGn;C{ALQiew71T2g!$B@x{K(vGGe?O*eWfzTs@HtYIXU+y
zL*b{iufSsTi6FV&l&n=E&7RVa3_9D$#N?4=XArf_>tj`k@+ISE#`9c#lTrb<=L
zPMq6q=K4opEK;vQ&B>fvt9k|Swwz)73#R!^7pV9p$U-}YaUd6{I=DnfB$c$~eDvz>
zm9=6bA47!w%fh}MDK9s7DgPi6(1ysu8mO>l2#cc~D<*yg{Nf_t1ag3g^n68$81(~7
zewVtHB$iC$opJ2@LKp2Vu3UXFd|bdOlRX88z|ocO%wS|z`N_v%<}^;#r|8v5tMfLB1qWE(X8crTYK
zkro?_)zkOF4#OZi3&lI`IsJ1RmBi2Hi*CUTgDtz8W`4K*o`t8wrU;-Q}
z$a$aZ9d~#X{L+m|aCS*>rUcamx83^0SAlWgpU>Q)3=b+UawLo+zw?{Q`eD(BSST2h
zU++TVy-|ckDTKw2m~PjjroEZOhFfvSlxVv~mPJ2)%B{QPi}hu}1|NJ(7GP}^|20IS
zxS=~m+IcD>(;)^PB$%hJuHlUGR&F&Y`+_%<)<}NdYHcHOt}W)z5REm1buaSBykGWS
z4gxaEL@Q{xMJ7q_GJnAn#KZpNaYg{|NB@~6UPIU+mWiD{bqXO%Hz_Nswub+#mXfks
z-=5|?IvSQJ#}rdIAXTB8ELP0@>!wOTyy=c4)|~_3=4;L^A171)P#haG5-aBn1+i6m
z7=Of~`PtjOfzT_JV3oV$t8z=#&3N}%k+o9pAHQ1?SBKHj(L=rW8kLcHMm8_njMO?!
zgN@OTDCD^qyVfnqABw|bWxZ|UouMrJOJ<>tT60S0MIlS=!fRcqleu
zES-LYWm~Ql=v;FhZC5nqN>i1IMUH3MA8E#_*IZn)b;s0B4lm6V0j6$ta4Pcqsn>Tl
zzn^g{d0YF*aNs{Rx|f$!E7t}ga2et1(I>*{=ARsHR`!
znDe=j*VqP+vXwNNwLY6Gkhw7~N==gE)FU4>P2cCzC&7}=Gw^_zttm=|jUCJMaijhP
zeKw<9ytQmsJF=c@oGEe(5|y@Cf)u{07mHAe_0-3mUa5LNlM4)qUOB)PUqxW|v60ur
zmi6O!~^x>5FGjCz4{!V+?(Dyth5Gjs4x4f_4$vP2dEL6Dn
zRIi*ykNk#^up#_Qp)|sj^`qB!;xf95$?~8#NSWbV_OH*2Veb5d#83bNAJU
z>j&PW8Dr4Ansm{wVSS=ns$lnMo`r<{%vP5;RN;E4+(#k*mq4&O+^}>2^UdOr4ZPoUb^>CwdhK2*mF%1{XnUnO;Ssd-cF#JF4|i
zIFT9mmAr=~F+Dv!P5XmGZf>5_=Eq7u)~@z})t4#aX@RMs8HuO_k(leP+=|~jPcL-_
z%~aPfPP8G80Tc9zT;xVCS`xb)o~SK?uRx;oE{7LtgqF}4J@2lC?|DxBx0_wiShDc_
z+tz~JWP)UvaFAljhz5Xz^h$7OFbJqO9TlWlf&(DM5}lM4l?4iegiJ^YlZ{i#y4WT4LE5+0xN6M9yP
zZvL`zWz9;@Q@Vg3i~r_{o-$%<#9oxi_J^Li`sJMog6ri9C-ID)Nc||W>ETS#8LA*)
zsQlZ3?zTEf_wpx7ZSz(7N(tn)aMR^k+avUjq}kupXg2lz-&vW-7F3S+^uQ#??2aP+
zo~S(CWP@`!qW6FD=xKfW&0tE8ncfJSd?p#`Ts02En$FBxeONPItg5OfQv58Z#zGxV
z_u0GCB0?A9M9X-wlvjY?fhIsPRg@gn-$X_Im-L9DcB5(53kFC%Kc
z2~nq+h2Jn{otyly3A^t5`7{8^sOu338qY&fHMa(Zp40Nqs=j`CRPvPSup2eRj
z_#+||PG*^U_hMp9Mu!OJ>NYn+Nio%O7?gddJOTAQVys0Qa$3wrfq<6p*-yBcLqu<-bEx973E_sS@=Od)HdH&q0>vfuXhWnx{
zY;{=}f7a+Dbi%lJKMIs&XfpS@~B^-_g#;9{*xD
z;r20gWA59epbYKmW-6HAqP!~AQ!L?V@k$KH~W<@G*VD{E(urk;Iw!1Wu%fYyBI`@%yPwo^Zf
zYdG0oe2XP~!Ak)#er5FvM60T825R2zhVM!QifO9Y6DI^0GzBJ)R#UZOc#>y+-N8J&L}p
z*7HbDo~>H=#&KaV?4WXs9{gwVm~4z&8iG@vdBh)N#fCmrBz4N&AXAeAk=zqQ)}02i
zS(5+oO3&B1^o^jq^0NMuapwXY+*Wnvbh#lS8pE=bR_@UIa)MEp+`d#X^W9Zvsz1-F
zQ@?X#P72PNjdO^oc2!2{qP9IQilPU%XJ{4OI2Uf#WEUgPi3pa8+G}h
zzGDJ{Fd^12yeS4oaP)Gofb)E%hy@&sOqR|uKMg0_WN4H{87bTacyTe5lEIY}6A5b^RF0Qo4WZ{b5wfP{{=oaW9;eu4p;^U_IR_9?m^u
z8fyV1q!$n!G2r@Wb5&?hl&su9OGE84va52K%AH&ph>g%hIEqwX{R#+eG=CyLeD7)#
zCD)r*GqNaI&e0@u6=z&DTaNdjo`qS!D=A=VB#yPLiHRG6p);%E&q55lL>%8nUZ@w@
zqB=hw?_X9Uw8l`Y$$*vIh}O$=ZHA=k27aRbeN|#+9d;vjfWI`hA>}N3`voh&tNSB+
z^FfA=;*WQEKXtj1X^uCO!l`}?IjT$7*Q(SXN$JtoJ88T4u;8>R(5CD@GkIPNQ5R&-
zX;;n4mp9+rzhIPZW!=!pQLRtSEPkNF-3j#-K4TQNKWVzb;{1@Z$tYZ^^Nkpy_`9Q$
zHhp_yQD`G}rD6*=Je>W?SIKBb4+2`;JLi(@22JM-G)gJuMV(OHCmN>Nx)Eg-oYfL>
z0}nDjd^>8l2j0LhVj6O&mXaW0yPAku^wJvb@&eBf
zHL>4AGf`V`9&5tC!+q6M@MoKULQSM#z5h&t4LevtZN}@dEBRaUBxg!;>r_SK!>7qD
z*6yfS4BgCKMqWyS@(#xFwJ7(Ljgj;eMW>i5rHK`6*tSYV
zDA(U@B1u1+oRI{Y&upx@mJ{*-uAj^NX-hnADP^fr(8*L
zGulKZchuOXd;!^(%O+h~xv$pr42tLf1+T!70chazgNz>_V+SlaEELH8@pp{^4O}!<
zRCH1&ND?xT=|jl~gB_FnZIud2Fm}$b>)}Y8-hy(WP$~GAEd*KseEy&ovRb+#qMEGb
z^EUnetw&ehRq*xP;;bz<)NSFUu0$bXGL1Q6?deGEe}Klybu)gBRBJc#(X}LbeXFnj
zAtyH;6xVySi+G+axtNP1B&>zGjEZX<2mQ>p<$0c0;G_PG2x4&Xd0$KRX;rZwBTvd*
z!3QWx=9GSW$_d#edjE)JzczKzSK!p*QOg?MO!?sn<&@^DArck#RX!&{$s;B
zy;Q8)AE}|B1XAy8%hc$q)tu8aztAIDkr9q%W|R%!w1a!uYpoLC!KFAQhC?-&n04Zn
zSXecTYjw9^{`y|Mt*;2A7d?>^gaBjFfXPzv+!mPed7<
z)RbPsGVTCvwX|&aUh7xNuasS^-IQ)MsurA7MI88otyMisBtqzKn_{^5L}5ITO4J;A
zLV73PCrgiNYWFzJi;cLVXTLS9gf~8#K(8_}j~NcGOq8&MioZiHsv?`tba&5^o%mw(
z#LV)XmhL|mUCkCd&90JJzO5@0=|mp=yV_I`L6^e3fC~}*4#w~ob1$ihsbroV$JUys
zJuk{Lx7-AX14*j&*MrodZu-ZDVdtfjLAi=?f6guMH#
z%HWw1G?%rG&zqz4R<rLpVS^pY@YxEK`(s4Ta^q
zpsXgb0BdGdidr*_oSk7U@Ba78-eoI|m>5q2#!i)
zxl)^PZp6;motpI7cW3U3+U@@eM(>c{ZImt*G94g)zFt;>E=oJ_@W>vExLezljEa-`KxpD$x`r2rBNj&Fg1#@z>DuN7P`s6O;&D
z%o&6-*>2`4fd%{Fg)3`x;zagmPzS_ipTv1a&t-w{;y)}KyTcJ-KTc4>W$&`L*jp_f
zO{=K%6NC`KU6|bdI$5X*w)Z{l_dyIsiK0RLqxM8S7)JQR1?mt@2Y1PKZnx}xEE2}v
zS58pN&!VJLx5Xm{rgov36FP|K`
zk!K9iHS1~YE0ahWmmOh;nolf$M2drAKQerb
zEq$yccH5w@t*@}!YE5Y@;v6dEN(e7t?;&R025ohkj<3L@w14QLmsvFhG8Cf78ypE!
zr*3O%>{s$Zyj?$%a5-ejIx5uoR@Fw3@L}T7iW|^7GFC@f1T2)qLW^9-2Y5btk?6XtQhMXb9aIaz_}_shz;zrxABxLf;{oDeg
z+VxcG@^1YRJB}z=I_)cGu)T|;ud}RW+w2$&!l-LOnCB+#n>D_JBe{8EXFcDCL9_Um
ztAqDY{Dwb+rSdek!46TjPnTEKSu$(CuYOMZEFp^)hE*@n*`W?4xp^vcao^=CD(LR@
z_1jVAdJsC~LL|2H^E@MH*tb(8yM^G+?BfI9J!jnG10GgAowAZz!qZe?|6u}vT1QEYJ%13hcXWBgqJs@oCr=TOD
z7oD|K6%&6jQAMwV259VvZU6p4ZU4z~zk;;N?fOK5a=-r>drmU;l#{E+_A%Qp)`>*K
z=}5b7I_o$6qtWw#Q6c;B=VUIKo?bqygEG)Z!&VDakXd
zipj-V3A0{3@tSD_>WlAgW);kzq{m-~Q%eHE-S4A6bs2;iwe%Qc`5&jPDJhm?374v2
zfdIasAYYX(Oz902%jxLo{zkz64OAX|P6acm0O>`vsG$Gu;E+&||2>leh6egC15$@b
zoPzQ%66&@tS$d`g|Ggh1K)PuUi`kTET2iX~HAhbzlAjF)P
zHYIaFc>~uO(k&4f`4&M83P2CP_-{hN&47QU`X_5p$qo9#q8HqpQbiJ*%alRjdT6eA
z*Hq~4kHSC4F*=b;mz|JONRrdm9Nh|G$y}>cro3or8Uhy;P8CkPPMx%LrGpQ`E-|Wf
z3|RsJ+v+>&+wMEQR+(-54EShg#6Q?IMIl)cMNs=8A^jl#!T2S;BSF9TThb$ux#|)n
zoye7#l?zS+{yu3!x^}v{&)VT3!VbdI9aly|jpj1}auAOZ?Y8Te)b|TSy7H^`8$p!u
z^9st%EWheb!;Cfcq*m>mlORt%syfhBkn3z)QL`=|nTRXBQ1*|+w1^*yaH&Uro5_}9
z_zD>+H=L;~9^8TvGhh^%qY{H+lEkdw&YzbVRe)dUggRwUhX013H;Ps%(W^?&|AQ#2
z7gb4VCpJ=AOV1@s&&i36ynWb2TQM=&5Amqdy#i=2BfU~I9MYPh$p_}friyZ+(Gf>A
zac-ff)r)t*^{)WWR)+PRFaeo=p^Wp(J7!!JR;9ASYSa|t`;Cc5zL-@0yvo||E`5O>BO3YKlbN*=-g$R?Mm;GLZ8^0IZ9#nS(piLJWVHvZ^E6jkt|^+|)E7qS
zAX32!xiPxI{xWnrp#@@kb58;WA0Zt`85|*lmsrqA7KBEm?UpmJd^Ip^fwmdi{A60ptgvGpk`u+VMX*<_{eB
zVXbdKZPz<#S-^-u0e6q28r0;%_zW9Vf*zD!iJ9Ge15N(w1X$&h)^u
zKSdoL6|vr)O?757E#n`*Qb;1KD_CPyQ+jc8PR2`t8Bc(t%6N~ULIGoP(hEMvoGj5!
zJp`e(iT?S1U`q@
zqq>e7n`91)$O>*aroIA`c?0RU8Q&TA9AM4moQitQYE-F`1xA=Hd&uF#ttqu3p@k!j
zSj`j<{deZR)bJeNMm3|PeB(m`jpwS+TiPBYBM~^mHr0F;?@MxwaPiWq>BpRe8U9$q
zLZmT1Zg#xn4l#}|h>1FiQnGnk!U?0xZa*L`rd*Azs=uS5?lVO``wyTmiOI2)Pf`A=9;h*U=4ls
zIB6;zZrp3D3c`ygP~(k+G$C1KoMMv?VU4lf@V>`$re_;}dQ9`=N=)5CmXUd!GA}Xv
z{+?vE-2@9dS~yAN$;3h*B(h#_BCBbSS#R&&`@VcCP`;J`N>yLDP{eiSaQ%yQKe}Ba
z>}n`GjRMvPeeA#=)=TYQt~Y~-XON7q}3%yd-gkf1gFWE)g50kE7>K1S3tXEW!~|D
zfPHw$@iZm~3070fqZMLPsxI+!1^f#Wmp#Ub^Kq}`XL>v_tQJq0z(mv)cS*r99_lft
zyVwz7`j}`33O}p?G2EgyG#OYCN?u1V9ro@er;iAttZON3TTjN0&cb%$=`qZ&K<*8*
z7mEp+lwPkrPY+~8g+QI2jKPWtQ82L@xB>=EE5+9ImL|PpU!Rp^aeCR3ns-(1)Z%=B
z_cGD8;AcUltBsW)ZEo524qps&p_Mu?4!t*~9FXbTUDa^BZm=7!
zz5B4sakZHHK$OYN1}rc|L(in7$s_QDrSO?J)LaDO5{sop+%593i|5luYH%^abc53-
z`Wm4PZA-LLmpqU{5S>>h32Wva)oXsPNed=Qp+(Is#Zj1IGK-5caOf_NUGi0BY}$6w
z3E7!aSVgzQ1@@~$@=0ixWw&k21!ZmzO3>6LKA^hcY3t_pq$24GCZ{M^mdiF=~
z#ZlvZG84Bk8zzTCrGsUjh^u+O+b`(YzdmFY(6VM7%tDK@^y=@Vx|#GON)O%o?@2&!
z5mVTUwmfA06_*dY*V_Iy?7#RkO<0!I@Z{0cGIyN>@MO;>H8J$n?Pz1beJK^cW>&^I
zmVJINII9EezM~sbMhHQuB$>Y&gB=w_P4^I;j>JT1R*$Bp7yp$jwEE`VcuCp)=-6j`
z>Bir}OPr?PJ4HtOK$AW6*ykVLW!v6)?UN22sgF^}vRzhu_~?DGR=_eGkzT!E-1Bv7
zm3_LBgPVQP(k$rHpe9uY>I((Cim3r9i+wr2KSj{>9ZqyQUixr5
zcCbs{NgW^KTfgLD#_aDuzTAp5ahae5Lo9qJRjXHptB{XYq9C(zS!Rnf>DgBrF&N+D
z^Jch`Q!*MP#`n&ndGDshs+6U`hsR1<&TKO<0*Q}7SMTrloOYsJjH2E3&iPEm^0Sm(qb&N0sDU4db@qFzi
z%FpXe^2yMNppa2j9YgoDv~#2*ROp!J+=jzG7K^;^O-Ut%%S%LLA~2Y$6*Qep9D&!q
zPynr4*yjV^Fz_=5$EuQr@s0sH5eH1xzC%8{rS5Fb6d3SddiWl>SL8a6J3iW0+=(I8DJr4Tg8
zQPpOT_+J5)tRv3VaBwwZSyUl#v~K48$R8gn!oIsiup7g{hEl@I2uB;41aKc%Hw%k#
zCW%X_C4LtBw))FIoc!hkalUxU+_(~4ancR7#ew%D7Pk__@qw#-Cbu~(GaF7V9+XW85-k{(B=|k*D^OskGT(jU(}G>aUVAvE
z52MOFtU6GjygwVJ-c^lbynXZvAnph+H%Lwux#@xLeLDE<$lQIiJ#lIAVlR=T!eXsB
z$CZ<7Y|SfxzpcJK`DY@rHMtTU8v{$#bvlN_H6Uyua^*P&Q_VzruQJF{UOimx#8o?=
z<0yA`@>#CfIeN)@#C58@9&3PPZZBBsH)?K#f#RM!<+Es4Y1*935#{lT%=}_%XMcxZ
zWPlQ*U!-@WpJ-=+!JN#(Vp?TdMIEz-vHm}wphSl(*=QpcEZ?|D^t#R*6wBd~7~)
zcA8?NWssvGLYElyAN21PiNCi)PyzVA`)}|7m>{4Cx-5bM2`Ic>5PAb?ATX2$0ASHS
zQSfzKOhKX=0+1naBw)gzs{nvfmo5na$2e$Gz{pJUS)6Fh2Z@3D8gu{f*hB1mOT%lks-Z=
z-Q2KqQ>B4G;>4`Fe2wbU!H=k)+53iIB%td~EQe)5dWAz=?|g_8QP+Y4L051R1Snhd
zoS?-n@HOV^NhrV&QF~xH!xxHrzdXg!LWUFszOf(#Hebt~uNqBQ^eW(@`^o}Kj
zPJ42fO|P1x0B1&q9t@GC7K&9$QErlxZ!;mHy>G7^46(N-3@;!a7onmjAuRt(l4mXI
zRR4;CDTE3#&*Ilbx3D|Y;n4U`T=2@&q^ztK+F}t=FJ&=^tPJRpU~0G>lKzO0bUz>`
z%Ws6>fd@p$*+5JHiKGu6AQj~6F@c-`_&~Q?3?Xn?08CT>7J#9_kcQ0@r^xFDgup2r
zLjjU;8Vry{f*uWYEENm_91{AUeHu`|0BEGBtZxBw5<4_PaU4i4zxIRzmuaoHUviC|sLWrWCV
z{;psU%n|3{jOFu;9a-jZ2{jjWo-?X((LR;t_~%q}CGO6GyI$xgBSd2_Sp
zh+CKa@5RUG@X((R`+ovT{yUWe9=rQkeQZ1<(9Z
z*bTBaq?8HgCp5zLO_1rMx9oNGoU*4bfMm?-?$dZmARum-2){C4nTGDv<0*8USAPZ~WV2XgR_g`hKIo}T04)Z(8`
zkfFyRm6;`<5!)K+0q+%HmK2ZSCN1ZRy+}D(jUdF&BKwXSWH%kCgO~X8e4Ebx+^W}Y
zQnD-Z+rpr1VSAx&nJu>wVThOqX%;bKAY`X_x&vLcOgT?Fg%0EuOV1RC2yAWqN1j3A4DrvQ
z>wn~#RS1&Z)Lk
zbK^|q(B`=dhJAE?GS94F;r3$ziDf?$k&-cE+DGk4J!O-Mtz4Nv%;h1^wD11MIL-6{
z{qvI@CZLnjpUEU<>ZqZ_2$99q*U6Ibc?Hg;R2_qdOy^Bzx3)mFI3Hcx^GfIZlVi4v
z?}N&}sq^EPnD1yJcJY%(L_9iI4ja{n8{dyEI(1uyofcY}hVV6Qqv!%r-GX)mLMk>b
zku_{Wv?MVmC?^lMG3=Ut>DT$%e44m&(kpMr1-quEqIY)_&
z#ZKQSy%wSDP%Q0ym9KD4t1}cqxTto>>dwSgGmlz4v`30)1ka$Mkxk)F4f2QydOuq&
zBpe;2-_-nP>^?%udH)TOjo?5P;=rGMJzpti@MVryA4o-Z5(1nm#TN#;bTSXme1#bJ
zK=X}BgUr&FN!1ijT}Sa#1Wl>k#m73W&fKaNP3)fLt)i8i)L)ydN`xCaGMv2OtvDf=7t*>7v`ruiWov
zco7?Ohf%QW2(+heKKkah=vKou1TTrEe;*Zqru&T>6;=;AZTYpSrNP<;?`{*hR=!zW
zOk~y{P>!I7$0zXL>^yl$4?efAt$zNIuv^;C9V$7HIFUGY{8ErS)+eK)=rI256OXYx
z{eG5ZKzCm%&v8s`L&6#0XS|FkO!NG)u02p^kE%(M+)b#SU$#<_e>T*FS*9y9+gEz<
ze4Q-Obo~&fW1+&<>dQRB-+CRK@T7rlKna#(k`X~_MFwwhMQ`UZ2_7*wL`BX8(*QY?
z{*d_!Jkg_WUM=FLhv8>KegK97ksXBAd^fyaNjp+^Of>-&Fx
z4m?T=^bO4T6aRJ0GyWjwFk|#WTvW7q@i!?b&%a5?E9-S8UHbnomzaC;Oy1I&E6Kc<
zi^aO3bL78UtRK+1~G8
zmaY%3R8ZZe5)@E>9XyYXHFAHarU?8Z9yy>Xl(|v+=#e6ZAF%mAoXcJ`b+~h2j-J4+s+IPPv!1IfRgXlJFa~*OdhXB9#3nL{#PJyeCD&!=4HkneNwOu7M@wo&;(KE$KRJ6
zkJ4tUrBL*(f9inrMJ6bN;>Xbu#dmV>JI$~n!%$-GU3b=+jnfR+V-sB_FXms&EqS~o
z!2%n#!AYrTaUUg(HAAnZf0O@mjS!Y9YcPkzZ|`12)1`2}I|%}sKGih@cb^g?qX~My
z_ZzMW^_vZViEIBO{efA>i$Q^L+S-k$C;tvY`Uve}rD0fr0J`x;lvw;g&qE3|AQt}if=!~4?u6d)~
z&8hL~NC?uOX<%#7-o=Migo(W$cglPR-1Y{rg|0tAoDZ$NP&d5--Cj3@d{t5Wqa|_q
z4n-u>Rq3U6>3=M1=nF`aQ+Wl!10e*H=@=`tLTMoC0|wkc&7kxhEysd@Lf*K#Ssv
zrzZE2o!chpY5=G~q0fi&p=iS!IY=nHlMvCGQKp=F2!{-l6!VV0T6u@NT{IRa
zHznU4EznlhH6pk7dM=1~s1|LavM{Ty=|*ZjTGQ#x#u1smDIb|HyTyff^{w!M8-mX8
zl+=eC=9Mq7oG~NO<>{@YU_Hf^maO|pJfRe6oIOgDLXay63(#7_-D0sdt@sW)Vt!M`
zS$3p1I|i>w_@%+ATozI&=(7F5K}26kc{IRO;5Rm~&OCe0sX~LBSe@eE_MnG5r9CAI
zM!;nl0dK8uCJ5mcrZy146Ewr?>C+r9^5+a=87)Q*)%q#~=*~zId@Jn!tmLsvW93=}XI_Mf93*CiK`KKxVPc|R
z^852EP&01u$KP-{!}lVi$2H0;+8VwmI!k$Btk~P5$Wx5
z8TWo)&t2ceK`!m?6!sb5UuoTsv!ehtOx5n=il1!P@Z;wxH220y$zX
zj=k?2?~_nq>SrmpWqG8cqmU1E~G;KqkmTo5Yc(2ZcOx|)$UgSP=u&g*!
zW2v_md~Rjo#zj^qU4PA)=;mtj#sm~F(2asijyCBI#pJmN1^|}p0P2VYyRyCD#R8-L
zDOc;`{hii83Y!ScOp4
zWp<RRSehowZt6Vdil>(TD%oOM}6c@FSH-Vx%&8=AhF3oQ^)w!
z)%r9(oFH5_?|j_Xnb5V5Xhj8THi6!9UR@E{eFSRSu&j$r^z>~*-VryIjZ=At2t*Y+
zDhESFu2rPL)mR$NYQh{Ota{dK7k$V^(EU3uWbcsIKR$zmwPWFp>8<0(V!Bh({jKUb
z2!VR66_PziaMWQjZIK4qTCCG0N=q!GpX{!YI32Q4Yd)hlX9FGor=9cuYNGl6cnH0B
zsfkFD4$^Bd0vd`Sp?4_)2`If6rS~qqg$`0gB$UuWM1fF6nt-7f>0J?@PoC#||Ay~R
z?s=a%duPth+4DMg?%ti9+4G!gi@B#k3Bb24Hs|826bo!6J(qP*uH@K%00UpJJ^N)b
zH+3@`$}`>pdG{Bk2t3RO%+lV^YUCM9e54EhUKI*1up)nzb*!Ni(ifeu<1hJZp#Wrbq1@I$SlRq_y}``#dEE8+_G`AJfl{a{rCx
zPs$y)Mg1R<(Yi;cWBi}{^2JCo838B;d>A7~tf_XOjWAw)2ooEsP9?iQgLs0`a@pFgOv)VZs;7c0)}T%h4-`Nn1V7XtDxIIY%eLGJ_ZfZH^;WO+Vc*5+vPhHH
zQwOaSed{wVQ4jW|*QsBAfA3$rysh%oH|D+n@*)0-tWHk{)AzaO$gWyj%(!Z55jhPX
zbuKSU5Ye`mp;Cuj
zG0}A!ad!So3|=6_2Kw;EN#UcTn289|?klB!t_^T*0rc{K*ko?PeP@T>yD(`{)6n#6
z(p@RSypq|kbs?$JS@NE9{R5f`!q+ImrH#4{!0oFV}(h$b*^6G@xVXe;uq<>zUe
zeUpIos~zv)QRSk4gZIDV!8Mo>47P%(6^I+AtcMLs1rZL{dec^B0t{b;
z*fN)HtRM&SiKbovsVfti?Q^+BLQ4pmE$LN@aUonXom^r&Ow#j|Ur
z#9l8%efN%~8pX7K8H;`r{TlTI{46NneN0+!p*dVp8LX=z!b%0NFa3NmU}!XA@D6r2AoQY#1nC`Igm=Rh|NhTkpVB9A
z6!H4R+r`Di2_$4Cj`(G#`E!-r+lBIG8BsDu$s_phNv=emrMZw26t5?i-J^+!*DneU
z6?Ku8SxoXU+g{yUVxMq&>>|_vY!ea)bH?oo9fJL{NE0DqUi`9Vop(=VnnXCSgxJ7o
z7DxNHsc#>@9>Mz{aqX7$b{~iVVvA#?te#(>sGiIXwQOk;tsCLGvU_R0*OfsyWM3Z$
z%~SW}L3hr0aeE|nuq3`%(P7Q@lW-C6@dqA%m8Xr|?DY#9bdggyMG-xO=9d>R>t+|n
zR3-EOes*$Q4r%%v_@pn%a*S>sRLns~Lr)O(9`O&LCpSLZ=p8$jNlG+AF2X^*UX4jo
zz9ul4AHMZ|yK%3K$(i?~35#igeg2?aq8srbKWl+qqxG@X#z)J|5gT{nnmtBw=HV(v
zigQ{4J9fH!;%5j0E8zk^Gt)v`uIQ}p8~ik+0C`U+`I?@U%e#vxfNB!`Nf4R^Da@BX
z^z1!%m*%s9Hi`LJUC*$r=Jzlpgrr2i_cHcj2w*=6+KVb}
z(p1w4gE`c7^|$~~Yv6@0yOPoLGT+$LzzpS69lrU>G4;GXoPcME5|?5E4Qsty-W$@9n!c}i~(B)U4)r?^Zt(e%-XXszGD&6Uo=SS>+oJCFh{`6
zFYx@Pv?5AH`=}P`eWNa<_5Pt;9$U5>AzQ&C!cN{as*YTl)x%N89cLhq#y(N-Sv|PP
zGGCZj`#2Q0oitlwCs5zH$(`N5R;r^1K81-Lp50nmFK?esgw|0N>?1WnN2$$!^giUI7YG5GL--;H)$Bf*hyUmp_B{xvX>1Ahi=b1wPY2vNAWK6`P9}?
zcma!2aj_)X-ap|y?}PHrWkS|&ITQ2r@tqgKHw)ov3xhiK`$ne>WC}S2z4H)8_V%$`
zIZH@Vam14U{nHfkPRo&O;u^|MwwEgSfOoGs7$R~>60Z?c_~i#Jd&NIqWdk2
ziA;S#CH-{1oU~~6A%RSxdx5YYE&t@(iae=Q;G9e{oWhlyfv(8iX0^M_Eui398wplZ
zN#=UA_{BCTI@w8?$O?N*$V5^r8#4j1B4N;E2-o8b&9ZvbqI=PSGMFW~6c)Dl{DQi^
zC`1N7;TO8X#28>$5?$fOdXh6!jZCWZ&E_2;&FOC5Ax&g^`EO!J5m<&|ksgB5
zsU%w?Yv3(q=?&iwLDrn|%T)3lxs?MtP+j%bGJL%AZPy0dY-btD-`(X+j{;2PB>sD6
zX>-u9_{)=?S)fTO-J|I47}7cJ@D@*uwdBWwIK6GzyJgH=7!4&F;yDg2sB=g)VhgZ$
zVIva{9XdZ
zbZo8|vI$~s)dp+#C^
z#TQJ_BMS7gVK7rm^DQ!9i#+%Fm{{m2#n709l=zDI8O;GA%mVJphqhrW224x&`zIl*eM{`M_Da)`z#)R@-&31`nIm55d-wB>rr00BI($3G9lCH{`JFCu@QQ%
zP&a>mrLknMm|=iB2YZVg=25_=JiDp{k?mra{=hT$-A1~k2qRh9&Ha36@EHYRWOd{v
z!s8pCb~|))c=IEv@rGFK6cw9~io>Z>t!O~fI5<_<*TBGT)H(C5w|F@x#>x+wJMeYD
zmA*|K@gTQjwS_!o;fI*iz>G@7t=2IM7tcfArwVD>;sxFA;#~R#{rK0k4vf!011>}a
zYsgUMuZb%$OU%4wuUX!>u`kvIJ}R|FulwJfu$(62ga6R&fQon0BMZ`mOgwbcdh15EgHiYFGU#7uL%DNNXRu#+?V&8<_mIJXdrdSN$
zw}(pV(z#IQuIU4>lIK-y@S!RZIC*&E`++|ucbx>LV(CxRWIbnf1N>_EK+
z<Wxu$#iQ_1$_vREVdJjzVfkt;VUU0RaKQ<;H>nSitE%ImRPMm?EkMNP}M+I#6q
zLWILC!=PZu0_*BL)e*}oiR*~?Yen$X&wI{70I9DyulxijRz=+y^tNLSDY|CS=?m~y
z7K;a&2*H@K`T3K6+KR@LY>lDwE6_yHIm-mmF096jt&H=S?)g|W#Nex_n5Sif!jBkB
zsUMt1%&;qa+ze7U
zbF;X)9#+cxuzJ&J6{PH(G#9c0+u%OnenTg~%;>C+81Tr*I+2n(ff>pU7zR@-j>@^;
zJzCc2k~4(VUdG~=#k~d+H%$kSRJKJd_6@ZAZim_mP{XBliZcVPO4f=xOHj9c!@#y7
z>8MSE-vbW~*=r?LW5x2hA?CfgtRfS-tpU2U{t1;Gt>w5*QLDvw3?Blr-hC6;??_Lg
zS)aQuW)<)3XIfhZ>D5!Onb6Mf9!&+V0D%rZTM&=kL?OF^gIWLi#RR{gkC@hg=hAH-
z3>*&oQ%=VBJ?j^}3SS->(pB*Yhl1)24v0+W2XS;{m90X}LqO*%{v{zHq@$e3t2kX+
z^Tn`k)|TT55Z0b<8I%6B^Ggvtjtz+gHhzTbWI{sHnT7R?i~Yv3rDwtCKS?1Woj&>*iPPRAzTk0;%qjKZbBijf#a~u&dlf#8u0LHMTkrnDd98~1w?n;|@0$3V_;ryKsST=edQvY%pP5h8
z+xTd0tYRECSJKH{UE5tDK8LGsqkHH`UmIWhtFZaFOo0sqcQ$bwTlZ#Dk30%nW0IR1
z(&YMCYqz_6>4g?B4g@D3mCARVgYo;6$H7nU
zYyl@YH_Q|sb&;oP?RKw21OkKr3+7Rtxx%0s)B%DZh$$#1c~>mrRDbc+Q}j*Bf1*X-
z(4y~8{c+mAsoK7&+QTcP61H*u=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="],
+ "react-tweet": ["react-tweet@3.3.1", "", { "dependencies": { "@swc/helpers": "^0.5.3", "clsx": "^2.0.0", "swr": "^2.2.4" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-0Gj1YgBTe1K85NBMoWBlUc17Rdc67gIJLlacrVgj+3jWIoXpFfxPdZ1U5OnWkkF9zxhphqs2pY1i//JBfP3Qog=="],
+
"readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="],
"readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
@@ -3287,6 +3290,8 @@
"swagger2openapi": ["swagger2openapi@7.0.8", "", { "dependencies": { "call-me-maybe": "^1.0.1", "node-fetch": "^2.6.1", "node-fetch-h2": "^2.3.0", "node-readfiles": "^0.2.0", "oas-kit-common": "^1.0.8", "oas-resolver": "^2.5.6", "oas-schema-walker": "^1.1.5", "oas-validator": "^5.0.8", "reftools": "^1.1.9", "yaml": "^1.10.0", "yargs": "^17.0.1" }, "bin": { "swagger2openapi": "swagger2openapi.js", "oas-validate": "oas-validate.js", "boast": "boast.js" } }, "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g=="],
+ "swr": ["swr@2.4.2", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-ej644Y2bvkIajfR32KGeSSdBXQW+ScjGjkybZgSE7kFpk9eGnV44XY9FJylXi+W75pavSX1PVNB57W5EbhGIYw=="],
+
"tabbable": ["tabbable@6.4.0", "", {}, "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg=="],
"tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="],